2013-01-03 153 views
2

我对使用PHP的SOAP有一个基本的了解,但是我陷入了我希望成为那些“DUH”时刻之一的局面。PHP SOAP客户端困境

我有,我用它来从远程站点检索信息,并使用它作为这样被一个WSDL文件: -

$ordernumber = 171994; 
$username = "[email protected]"; 
$password = "secret"; 
$arr = array("orderNumber" => $ordernumber,"orderReference" => ''); 

$client = new SoapClient(BASEPATH."/feed/Orders.wsdl",array('trace' => 1)); 
$orders = $client->RetrieveOrder ($username,$password,'',array("orderElements" => $arr)); 

这工作正常的单笔订单,我得到了我想要的信息。但是,如果我想检索多个订单,那么我正在运行一个foreach循环,为每个订单发送一个请求。

根据文档,我应该能够一次性提供一系列订单并检索多个订单,如果我使用在线工具http://soapclient.com/soaptest.html并输入多个订单,那么我会得到预期的结果。这会从soapclient.com生成的XML请求如下: -

<email xsi:type="xsd:string">[email protected]</email> 
<password xsi:type="xsd:string">secret</password> 
<messageHeader xsi:type="tns:messageHeaderElement"> 
<senderId xsi:type="xsd:string"/> 
<receiverId xsi:type="xsd:string"/> 
<messageId xsi:type="xsd:string"/> 
<transactionId xsi:type="xsd:string"/> 
<transactionTimeStamp xsi:type="xsd:dateTime"/> 
</messageHeader> 
<orderElements xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:queryElement[2]"> 
<item xsi:type="tns:queryElement"> 
<orderReference xsi:type="xsd:int"/> 
<orderNumber xsi:type="xsd:int">171994</orderNumber> 
</item> 
<item xsi:type="tns:queryElement"> 
<orderReference xsi:type="xsd:int"/> 
<orderNumber xsi:type="xsd:int">172101</orderNumber> 
</item> 
</orderElements> 

的的MessageHeader部分是可选的,我只是在上面呼叫发信'。

任何人都可以告诉我如何使用PHP SOAPCLIENT,我可以发送多个订单的单个请求?

请多关照:-)

编辑:

感谢@DeaconDesperado和@ EM-创作您repsonses。 @DeaconDesperado是对的 - 我应该可以使用$ client-> VendaRetrieveOrder方法。我已经尝试了许多方法来生成orderElements阵列,下面是最近在我眼里最近...

$orderElements = 
Array 
(
[0] => stdClass Object 
    (
     [orderNumber] => 236431 
     [orderReference] => 
    ) 
[1] => stdClass Object 
    (
     [orderNumber] => 236431 
     [orderReference] => 
    ) 
) 

$orders = $client->VendaRetrieveOrder ($username,$password,'',array("orderElements" => $orderElements)); 

但是,当我使用然后我得到下面的被困错误。

SOAP-ERROR: Encoding: object hasn't 'orderReference' property 
+0

不应该使用$ client - > __ soapCall()吗? http://php.net/manual/en/soapclient.soapcall.php –

+1

@ EM-Creations它不应该直接调用底层'__soapCall()'方法,它的下划线模糊处理是有原因的。 ..这是一个实用工具,它允许WSDL中的可调用对象直接用在客户端对象上,正如@ l0ckm4试图用'RetrieveOrder'所做的那样。 – DeaconDesperado

+0

@ l0ckm4您的查询数组在尝试获取多个订单时的外观如何?上面的代码只是寻找一个编号的顺序,并不会帮助我们发现问题。 – DeaconDesperado

回答