如何使用SoapClient类进行PHP SOAP调用

我习惯于编写PHP代码,但不经常使用面向对象的编码。 我现在需要与SOAP交互(作为客户端),并且无法获得正确的语法。 我有一个WSDL文件,它允许我使用SoapClient类正确地build立一个新的连接。 但是,我无法真正做出正确的调用,并返回数据。 我需要发送以下(简化)的数据:

  • 联系人ID
  • 联系人姓名
  • 一般描述

在WSDL文档中定义了两个函数,但我只需要一个(下面的“FirstFunction”)。 这里是我运行的脚本获取有关可用函数和types的信息:

$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" } 

假设我想用数据调用FirstFunction:

  • 联系人ID:100
  • 联系人姓名:John
  • 一般说明:每桶石油
  • 金额:500

什么是正确的语法? 我一直在尝试各种select,但它看起来肥皂结构是非常灵活的,所以有很多方法来做到这一点。 无法从手册中弄清楚…


更新1:从MMK尝试样品:

 $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()的输出中看到的,有一个叫Contactstruct ,所以我想我需要弄清楚我的参数包括联系人数据,但问题是:怎么样?

更新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, ); 

在这两种情况下都出错:对象没有“联系人”属性

这是你需要做的。

只是想知道,我试图重新创build你的情况…


  • 对于这个例子,我用一个名为Function1WebMethod做了一个.NET示例webservice,这些参数是:

Function1(Contact Contact,string描述,int数量)

  • 其中Contact只是一个bean class ,有getter和setter的idname就像你的情况。

  • 您可以在以下位置下载此示例web服务:

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


代码。

这是你在PHP端需要做的事情:

(testing和工作)

 <?php /* Create a class for your webservice structure, in this case: Contact */ class Contact { function Contact($id, $name) { $this->id = $id; $this->name = $name; } } /* Initialize webservice with your WSDL */ $client = new SoapClient("http://localhost:10139/Service1.asmx?wsdl"); /* Fill your Contact Object */ $contact = new Contact(100, "John"); /* Set your parameters for the request */ $params = array( "Contact" => $contact, "description" => "Barrel of Oil", "amount" => 500, ); /* Invoke webservice method with your parameters, in this case: Function1 */ $response = $client->__soapCall("Function1", array($params)); /* Print webservice response */ var_dump($response); ?> 

我怎么知道这个工作?

  • 如果你做print_r($params); 你会看到这个输出,因为你的web服务期望:

Array([Contact] => Contact Object([id] => 100 [name] => John)[description] =>桶数[amount] => 500)

  • 当我debugging示例.NET Web服务时,我得到了这个:

在这里输入图像说明

(正如你所看到的, Contact对象不是空的,也是其他参数,这意味着你的请求已经成功地从PHP端完成)。

  • .NET示例webservice的响应是预期的,并在PHP端显示:

对象(stdClass)[3] public'Function1Result'=> string'请求的详细信息! id:100,名字:John,描述:桶数,数量:500'(长度= 98)


希望这可以帮助 :-)

您也可以使用SOAP服务:

 <?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); 

这是一个真正的服务的例子,它的工作原理。

希望这可以帮助。

首先初始化webservices:

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

然后设置并传递参数:

 $params = array ( "arg0" => $contactid, "arg1" => $desc, "arg2" => $contactname ); $response = $client->__soapCall('methodname', array($params)); 

请注意,方法名称在WSDL中可用作操作名称,例如:

 <operation name="methodname"> 

我不知道为什么我的web服务与你具有相同的结构,但它不需要类参数,只是数组。

例如: – 我的WSDL:

 <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('Ym-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); 

但成功!

读这个;-

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

要么

这是SOAP函数“__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>"; ?> 

如果您创buildSoapParam的对象,这将解决您的问题。 创build一个类并使用WebService给定的objecttype进行映射,初始化值并发送请求。 请参阅下面的示例。

 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); 

你需要申报class级合同

 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); 

您需要一个multidimensional array,您可以尝试以下操作:

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

在PHP中,数组是一个结构,非常灵活。 通常使用soap调用我使用XML包装器,所以不确定它是否会工作。

编辑:

你可能想要尝试的是创build一个json查询来发送或使用它来创build一个xml购买sorting如下: http : //onwebdev.blogspot.com/2011/08/php-converting-rss-到json.html