কীভাবে পিএইচপি এসওএপি কল করতে হবে সোপক্লিয়েন্ট ক্লাস ব্যবহার করে


130

আমি পিএইচপি কোড লিখতে অভ্যস্ত, তবে প্রায়শই অবজেক্ট-ওরিয়েন্টেড কোডিং ব্যবহার করি না। আমার এখন এসওএপি (ক্লায়েন্ট হিসাবে) এর সাথে ইন্টারঅ্যাক্ট করতে হবে এবং সিনট্যাক্সটি সঠিকভাবে পেতে সক্ষম নই। আমি একটি ডাব্লুএসডিএল ফাইল পেয়েছি যা আমাকে সোপক্লিয়েন্ট ক্লাস ব্যবহার করে সঠিকভাবে একটি নতুন সংযোগ স্থাপন করতে দেয়। তবে, আমি আসলে সঠিক কল করতে এবং ডেটা ফেরত পেতে অক্ষম। আমাকে নিম্নলিখিত (সরলীকৃত) ডেটা প্রেরণ করতে হবে:

  • যোগাযোগ আইডি
  • যোগাযোগের নাম
  • সাধারণ বিবরণ
  • পরিমাণ

ডাব্লুএসডিএল ডকুমেন্টে দুটি ফাংশন সংজ্ঞায়িত করা হয়েছে তবে আমার কেবলমাত্র একটি (নীচে "ফার্স্ট ফাংশন") প্রয়োজন। উপলব্ধ ক্রিয়াকলাপ এবং ধরণের তথ্য পেতে আমি যে স্ক্রিপ্টটি চালাচ্ছি এটি এখানে:

$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions()); 
var_dump($client->__getTypes()); 

এবং এটি এখানে উত্পাদিত হয়:

array(
  [0] => "FirstFunction Function1(FirstFunction $parameters)",
  [1] => "SecondFunction Function2(SecondFunction $parameters)",
);

array(
  [0] => struct Contact {
    id id;
    name name;
  }
  [1] => string "string description"
  [2] => string "int amount"
}

বলুন আমি ডেটা সহ ফার্স্ট ফাংশনে কল করতে চাই:

  • যোগাযোগ আইডি: 100
  • যোগাযোগের নাম: জন
  • সাধারণ বিবরণ: তেল ব্যারেল
  • পরিমাণ: 500

সঠিক বাক্য গঠন কী হবে? আমি সব ধরণের অপশন চেষ্টা করে দেখছি তবে এটি সাবান কাঠামো বেশ নমনীয় তাই এটি করার অনেকগুলি উপায় রয়েছে। ম্যানুয়াল থেকে এটি বের করতে পারেনি ...


আপডেট 1: এমএমকে থেকে নমুনা চেষ্টা:

$client = new SoapClient("http://example.com/webservices?wsdl");

$params = array(
  "id" => 100,
  "name" => "John",
  "description" => "Barrel of Oil",
  "amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));

কিন্তু আমি এই প্রতিক্রিয়া পাবেন: Object has no 'Contact' property। আপনি আউটপুট দেখতে পারেন getTypes(), একটি হয় structনামক Contact, তাই আমি আমি একরকম পরিষ্কার আমার পরামিতি যোগাযোগ ডেটা অন্তর্ভুক্ত করতে হবে, কিন্তু প্রশ্ন হচ্ছে, কীভাবে?

আপডেট 2: আমি এই কাঠামোগুলিও চেষ্টা করেছি, একই ত্রুটি।

$params = array(
  array(
    "id" => 100,
    "name" => "John",
  ),
  "Barrel of Oil",
  500,
);

পাশাপাশি:

$params = array(
  "Contact" => array(
    "id" => 100,
    "name" => "John",
  ),
  "description" => "Barrel of Oil",
  "amount" => 500,
);

উভয় ক্ষেত্রে ত্রুটি: বস্তুর কোনও 'পরিচিতি' সম্পত্তি নেই `

php  soap 

উত্তর:


178

এটি আপনার করা দরকার।

আমি পরিস্থিতি আবার তৈরি করার চেষ্টা করেছি ...


  • এই উদাহরণস্বরূপ, আমি একটি সঙ্গে একটি .NET নমুনা webservice (ws) তৈরি WebMethodনামক Function1নিম্নলিখিত প্যারাম আশা:

ফাংশন 1 (যোগাযোগের পরিচিতি, স্ট্রিংয়ের বর্ণনা, সংখ্যার পরিমাণ)

  • কোথায় Contactমাত্র একটি মডেল getters এবং জন্য setters রয়েছে idএবং nameআপনার ক্ষেত্রে মত।

  • আপনি নেট নেট নমুনা ডাব্লুএস এখানে ডাউনলোড করতে পারেন:

https://www.dropbox.com/s/6pz1w94a52o5xah/11593623.zip


কোড.

আপনার পিএইচপি সাইডে এটি করা দরকার:

(পরীক্ষিত এবং কাজ করা)

<?php
// Create Contact class
class Contact {
    public function __construct($id, $name) 
    {
        $this->id = $id;
        $this->name = $name;
    }
}

// Initialize WS with the WSDL
$client = new SoapClient("http://localhost:10139/Service1.asmx?wsdl");

// Create Contact obj
$contact = new Contact(100, "John");

// Set request params
$params = array(
  "Contact" => $contact,
  "description" => "Barrel of Oil",
  "amount" => 500,
);

// Invoke WS method (Function1) with the request params 
$response = $client->__soapCall("Function1", array($params));

// Print WS response
var_dump($response);

?>

পুরো বিষয়টি পরীক্ষা করা হচ্ছে।

  • আপনি যদি print_r($params)এটি করেন তবে নীচের আউটপুটটি দেখতে পাবেন, যেমনটি আপনার ডাব্লুএস আশা করবে:

অ্যারে ([যোগাযোগ] => যোগাযোগের অবজেক্ট ([আইডি] => ১০০ [নাম] => জন) [বিবরণ] => তেলের ব্যারেল [পরিমাণ] => ৫০০))

  • .NET নমুনা ডাব্লুএস যখন আমি ডিবাগ করলাম তখন আমি নিম্নলিখিতগুলি পেয়েছিলাম:

এখানে চিত্র বর্ণনা লিখুন

(যেমন আপনি দেখতে পাচ্ছেন, Contactঅবজেক্টটি nullঅন্য প্যারামগুলিও নয় That এর অর্থ আপনার পিএইচপি পাশ থেকে সফলভাবে অনুরোধ করা হয়েছিল)

  • .NET নমুনা ডাব্লুএস এর প্রতিক্রিয়া প্রত্যাশিত একটি এবং এটিই আমি পিএইচপি পাশ পেয়েছিলাম:

অবজেক্ট (stdClass) [3] সর্বজনীন 'Function1Result' => স্ট্রিং 'আপনার অনুরোধের বিশদ তথ্য! আইডি: 100, নাম: জন, বিবরণ: তেলের পিপা, পরিমাণ: 500 '(দৈর্ঘ্য = 98)


শুভ কোডিং!


3
পারফেক্ট! আমি অভিনয় করেছিলাম যেমন আমি সত্যের চেয়ে এসওএপি পরিষেবাদি সম্পর্কে কিছুটা বেশি জানতাম এবং যেখানে আমার দরকার সেখানে এটি আমাকে পেয়েছে।
chapman84

1
আমি প্রশ্নটি জিজ্ঞাসা করিনি, অন্যথায় আমি চাইতাম। প্রশ্ন এবং এই উত্তর যদিও আমার কাছ থেকে উত্সাহ পেয়েছে।
chapman84

4
@ ব্যবহারকারীর এটি গ্রহণ করা উচিত :) বিটিডাব্লু, খুব সুন্দর উত্তর, সম্পূর্ণ এবং খুব পরিষ্কার। +1
ইয়ান 3939

এর জন্য ধন্যবাদ! লস 'এসওএপি কাঠামো বুঝতে বুস্ট।
ইটকোডপ্লেস্লিপ

69

আপনি এসওএপি পরিষেবাগুলিও এইভাবে ব্যবহার করতে পারেন:

<?php 
//Create the client object
$soapclient = new SoapClient('http://www.webservicex.net/globalweather.asmx?WSDL');

//Use the functions of the client, the params of the function are in 
//the associative array
$params = array('CountryName' => 'Spain', 'CityName' => 'Alicante');
$response = $soapclient->getWeather($params);

var_dump($response);

// Get the Cities By Country
$param = array('CountryName' => 'Spain');
$response = $soapclient->getCitiesByCountry($param);

var_dump($response);

এটি সত্যিকারের পরিষেবা সহ একটি উদাহরণ এবং এটি কার্যকর হয়।

আশাকরি এটা সাহায্য করবে.


আমি নিম্নলিখিত ত্রুটি পেয়েছি: অবজেক্ট (stdClass) # 70 (1) {["GetWeatherResult"] => স্ট্রিং (14) "ডেটা পাওয়া যায় নি"} কোন ধারণা?
ইলকার বালতাচি

তারা শহরগুলির স্ট্রিংগুলি পরিবর্তন করেছে বলে মনে হচ্ছে। আমি কেবলমাত্র তাদের দেওয়া অন্য পরিষেবাতে অন্য কল দিয়ে উদাহরণটি আপডেট করেছি এবং এটি কাজ করছে। তারা যে স্ট্রিংগুলি শহর হিসাবে ফিরিয়েছে সেগুলি ব্যবহার করার চেষ্টা করেছি, তবে মনে হয় না যে, যেভাবেই সিটিসাইবাইকাউন্ট্রি () ফাংশন কল করতে হয় তার উদাহরণ হিসাবে কাজ করে।
সালভাদোর পি।

30

প্রথমে ওয়েবসার্চেস শুরু করুন:

$client = new SoapClient("http://example.com/webservices?wsdl");

তারপরে পরামিতিগুলি সেট এবং পাস করুন:

$params = array (
    "arg0" => $contactid,
    "arg1" => $desc,
    "arg2" => $contactname
);

$response = $client->__soapCall('methodname', array($params));

নোট করুন যে পদ্ধতিটির নাম ডাব্লুএসডিএলে অপারেশন নাম হিসাবে উপলব্ধ, যেমন:

<operation name="methodname">

ধন্যবাদ! আমি এটি চেষ্টা করেছি কিন্তু আমি "ত্রুটির 'যোগাযোগের সম্পত্তি নেই" ত্রুটি পেয়েছি। সম্পূর্ণ বিবরণ সহ আমার প্রশ্ন আপডেট করবে। কোন ধারনা?

@ user16441 আপনি কি পরিষেবাটির ডাব্লুএসডিএল এবং স্কিমা পোস্ট করতে পারবেন? আমি সাধারণত এক্সএমএলটি পরিষেবাটি কী প্রত্যাশা করে তা নির্ধারণ করেই শুরু করি, তারপরে আমার ক্লায়েন্ট আসলে কী পাঠাচ্ছে তা নির্ধারণের জন্য ওয়্যারশার্ক ব্যবহার করে।
ডেভিডফ্যামথেসন

21

আমি জানি না কেন আমার ওয়েব পরিষেবায় আপনার সাথে একই কাঠামো রয়েছে তবে প্যারামিটারের জন্য এটি ক্লাসের প্রয়োজন নেই, কেবল অ্যারে।

উদাহরণস্বরূপ: - আমার ডাব্লুএসডিএল:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:ns="http://www.kiala.com/schemas/psws/1.0">
    <soapenv:Header/>
    <soapenv:Body>
        <ns:createOrder reference="260778">
            <identification>
                <sender>5390a7006cee11e0ae3e0800200c9a66</sender>
                <hash>831f8c1ad25e1dc89cf2d8f23d2af...fa85155f5c67627</hash>
                <originator>VITS-STAELENS</originator>
            </identification>
            <delivery>
                <from country="ES" node=””/>
                <to country="ES" node="0299"/>
            </delivery>
            <parcel>
                <description>Zoethout thee</description>
                <weight>0.100</weight>
                <orderNumber>10K24</orderNumber>
                <orderDate>2012-12-31</orderDate>
            </parcel>
            <receiver>
                <firstName>Gladys</firstName>
                <surname>Roldan de Moras</surname>
                <address>
                    <line1>Calle General Oraá 26</line1>
                    <line2>(4º izda)</line2>
                    <postalCode>28006</postalCode>
                    <city>Madrid</city>
                    <country>ES</country>
                </address>
                <email>gverbruggen@kiala.com</email>
                <language>es</language>
            </receiver>
        </ns:createOrder>
    </soapenv:Body>
</soapenv:Envelope>

আমি var_dump:

var_dump($client->getFunctions());
var_dump($client->getTypes());

ফলাফল এখানে:

array
  0 => string 'OrderConfirmation createOrder(OrderRequest $createOrder)' (length=56)

array
  0 => string 'struct OrderRequest {
 Identification identification;
 Delivery delivery;
 Parcel parcel;
 Receiver receiver;
 string reference;
}' (length=130)
  1 => string 'struct Identification {
 string sender;
 string hash;
 string originator;
}' (length=75)
  2 => string 'struct Delivery {
 Node from;
 Node to;
}' (length=41)
  3 => string 'struct Node {
 string country;
 string node;
}' (length=46)
  4 => string 'struct Parcel {
 string description;
 decimal weight;
 string orderNumber;
 date orderDate;
}' (length=93)
  5 => string 'struct Receiver {
 string firstName;
 string surname;
 Address address;
 string email;
 string language;
}' (length=106)
  6 => string 'struct Address {
 string line1;
 string line2;
 string postalCode;
 string city;
 string country;
}' (length=99)
  7 => string 'struct OrderConfirmation {
 string trackingNumber;
 string reference;
}' (length=71)
  8 => string 'struct OrderServiceException {
 string code;
 OrderServiceException faultInfo;
 string message;
}' (length=97)

সুতরাং আমার কোডে:

    $client  = new SoapClient('http://packandship-ws.kiala.com/psws/order?wsdl');

    $params = array(
        'reference' => $orderId,
        'identification' => array(
            'sender' => param('kiala', 'sender_id'),
            'hash' => hash('sha512', $orderId . param('kiala', 'sender_id') . param('kiala', 'password')),
            'originator' => null,
        ),
        'delivery' => array(
            'from' => array(
                'country' => 'es',
                'node' => '',
            ),
            'to' => array(
                'country' => 'es',
                'node' => '0299'
            ),
        ),
        'parcel' => array(
            'description' => 'Description',
            'weight' => 0.200,
            'orderNumber' => $orderId,
            'orderDate' => date('Y-m-d')
        ),
        'receiver' => array(
            'firstName' => 'Customer First Name',
            'surname' => 'Customer Sur Name',
            'address' => array(
                'line1' => 'Line 1 Adress',
                'line2' => 'Line 2 Adress',
                'postalCode' => 28006,
                'city' => 'Madrid',
                'country' => 'es',
                ),
            'email' => 'test.ceres@yahoo.com',
            'language' => 'es'
        )
    );
    $result = $client->createOrder($params);
    var_dump($result);

তবে এটি সফলভাবে!


1
কারণ এটা গঠন dependecies দেখায় আপনাদের উদাহরণ, আরো helpfull হয়
vladkras

3

এটি পড়ুন;

http://php.net/manual/en/soapclient.call.php

অথবা

এটি একটি ভাল উদাহরণ, এসওএপি ফাংশন "__call" এর জন্য। তবে এটি হ্রাস করা হয়।

<?php
    $wsdl = "http://webservices.tekever.eu/ctt/?wsdl";
    $int_zona = 5;
    $int_peso = 1001;
    $cliente = new SoapClient($wsdl);
    print "<p>Envio Internacional: ";
    $vem = $cliente->__call('CustoEMSInternacional',array($int_zona, $int_peso));
    print $vem;
    print "</p>";
?>

3

প্রথমে ডাব্লুএসডিএল থেকে আপনার সাবান প্রকল্প তৈরি করতে SoapUI ব্যবহার করুন । ডাব্লুএসডিএলের ক্রিয়াকলাপগুলির সাথে খেলতে অনুরোধ প্রেরণের চেষ্টা করুন। এক্সএমএল অনুরোধটি কীভাবে আপনার ডেটা ক্ষেত্রগুলি রচনা করে তা পর্যবেক্ষণ করুন।

এবং তারপরে, আপনার নিজের পছন্দমতো সোপক্লিয়েন্টের কাজ করতে যদি সমস্যা হয়, তবে আমি এখানে এটি ডিবাগ করব। বিকল্প ট্রেস সেট করুন যাতে __getLastRequest () ফাংশনটি ব্যবহারের জন্য উপলব্ধ।

$soapClient = new SoapClient('http://yourwdsdlurl.com?wsdl', ['trace' => true]);
$params = ['user' => 'Hey', 'account' => '12345'];
$response = $soapClient->__soapCall('<operation>', $params);
$xml = $soapClient->__getLastRequest();

তারপরে $ এক্সএমএল ভেরিয়েবলটিতে এমন এক্সএমএল থাকে যা আপনার অনুরোধের জন্য সোপক্লিয়েন্ট রচনা করে। এই এক্সএমএলকে সোপুআইতে উত্পন্ন একের সাথে তুলনা করুন।

আমার জন্য, SoapClient এসসিয়েতিভ আরে কি উপেক্ষা করা বলে মনে হয় $ প্যারাম এবং সূচিবদ্ধ অ্যারে যেমন ব্যাখ্যা, XML ভুল প্যারামিটার তথ্য সৃষ্টি হয়। এটি হ'ল, যদি আমি ডেটা $ প্যারামগুলিতে পুনরায় অর্ডার করি তবে $ প্রতিক্রিয়া সম্পূর্ণ আলাদা:

$params = ['account' => '12345', 'user' => 'Hey'];
$response = $soapClient->__soapCall('<operation>', $params);

3

আপনি যদি সোপপারামের অবজেক্টটি তৈরি করেন তবে এটি আপনার সমস্যার সমাধান করবে। একটি ক্লাস তৈরি করুন এবং এটি ওয়েব সার্ভিস দ্বারা প্রদত্ত বস্তুর ধরণের সাথে মানচিত্র করুন, মানগুলি আরম্ভ করুন এবং অনুরোধটি প্রেরণ করুন। নীচের নমুনা দেখুন।

struct Contact {

    function Contact ($pid, $pname)
    {
      id = $pid;
      name = $pname;
  }
}

$struct = new Contact(100,"John");

$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "Contact","http://soapinterop.org/xsd");

$ContactParam = new SoapParam($soapstruct, "Contact")

$response = $client->Function1($ContactParam);

1

আমার একই সমস্যা ছিল, তবে আমি এই জাতীয় যুক্তিগুলি কেবল মোড়ানো করেছি এবং এটি এখন কাজ করে।

    $args = array();
    $args['Header'] = array(
        'CustomerCode' => 'dsadsad',
        'Language' => 'fdsfasdf'
    );
    $args['RequestObject'] = $whatever;

    // this was the catch, double array with "Request"
    $response = $this->client->__soapCall($name, array(array( 'Request' => $args )));

এই ফাংশনটি ব্যবহার করে:

 print_r($this->client->__getLastRequest());

আপনার যুক্তিগুলির উপর নির্ভর করে আপনি অনুরোধ এক্সএমএলটি পরিবর্তন করছেন বা না তা দেখতে পাচ্ছেন।

সোপক্লিয়েন্ট বিকল্পগুলিতে [ট্রেস = 1, ব্যতিক্রম = 0] ব্যবহার করুন।


0

আপনার ক্লাস চুক্তি ঘোষণার দরকার

class Contract {
  public $id;
  public $name;
}

$contract = new Contract();
$contract->id = 100;
$contract->name = "John";

$params = array(
  "Contact" => $contract,
  "description" => "Barrel of Oil",
  "amount" => 500,
);

অথবা

$params = array(
  $contract,
  "description" => "Barrel of Oil",
  "amount" => 500,
);

তারপর

$response = $client->__soapCall("Function1", array("FirstFunction" => $params));

অথবা

$response = $client->__soapCall("Function1", $params);

0

আপনার একটি বহুমাত্রিক অ্যারে প্রয়োজন, আপনি নিম্নলিখিত চেষ্টা করতে পারেন:

$params = array(
   array(
      "id" => 100,
      "name" => "John",
   ),
   "Barrel of Oil",
   500
);

পিএইচপি-তে একটি অ্যারে একটি কাঠামো এবং খুব নমনীয়। সাধারণত সাবান কলগুলির সাথে আমি একটি এক্সএমএল মোড়ক ব্যবহার করি যাতে এটি কার্যকর হবে কিনা তা সম্পর্কে নিশ্চিত।

সম্পাদনা করুন:

আপনি যা দেখতে চাইতে পারেন তা এই বার্তাটি প্রেরণ করতে একটি জসন কোয়েরি তৈরি করা বা এটি ব্যবহার করে একটি এক্সএমএল ক্রয়ে এই পৃষ্ঠায় যা আছে তা অনুসরণ করে: http://onwebdev.blogspot.com/2011/08/php-converting-rss- টু-json.html


ধন্যবাদ, তবে এটি কার্যকর হয়নি। আপনি কীভাবে এক্সএমএল মোড়কে ব্যবহার করবেন, সম্ভবত

প্রথমে আপনাকে নিশ্চিত করতে হবে যে আপনার ডাব্লুএসডিএল এক্সএমএল মোড়কে পরিচালনা করতে পারে। তবে এটি অনুরূপ, আপনি এক্সএমএলে অনুরোধটি তৈরি করেন এবং বেশিরভাগ ক্ষেত্রে কার্ল ব্যবহার করেন। আমি ব্যাঙ্কের মাধ্যমে লেনদেন প্রক্রিয়া করতে এক্সএমএল সহ এসওএপি ব্যবহার করেছি। আপনি এটিকে স্টার্টার পয়েন্ট হিসাবে দেখতে পারেন। forums.digitlpoint.com/showthread.php?t=424619#post4004636 w3schools.com/soap/soap_intro.asp
জেমস উইলিয়ামস

0

WsdlInterpreter শ্রেণীর সাথে php5 অবজেক্ট তৈরি করার বিকল্প রয়েছে an এখানে আরও দেখুন: https://github.com/gkwelding/WSDLInterpreter

উদাহরণ স্বরূপ:

require_once 'WSDLInterpreter-v1.0.0/WSDLInterpreter.php';
$wsdlLocation = '<your wsdl url>?wsdl';
$wsdlInterpreter = new WSDLInterpreter($wsdlLocation);
$wsdlInterpreter->savePHP('.');

0

getLastRequest ():

এই পদ্ধতিটি কেবল তখনই কাজ করে যদি সোপক্লিয়েন্ট অবজেক্টটি ট্রেস বিকল্পটি সত্যে সেট করে তৈরি করা হয়েছিল।

এই ক্ষেত্রে সত্য 1 দ্বারা প্রতিনিধিত্ব করা হয়

$wsdl = storage_path('app/mywsdl.wsdl');
try{

  $options = array(
               // 'soap_version'=>SOAP_1_1,
               'trace'=>1,
               'exceptions'=>1,

                'cache_wsdl'=>WSDL_CACHE_NONE,
             //   'stream_context' => stream_context_create($arrContextOptions)
        );
           // $client = new \SoapClient($wsdl, array('cache_wsdl' => WSDL_CACHE_NONE) );
        $client = new \SoapClient($wsdl, array('cache_wsdl' => WSDL_CACHE_NONE));
        $client     = new \SoapClient($wsdl,$options); 

আমার জন্য কাজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.