如何使用复杂参数制作SoapClient请求?

时间:2013-12-23 09:01:15

标签: php web-services soap wsdl soapui

这是我第一次在PHP上使用SoapClient。我的任务是创建一个脚本来自动向服务器发送Soap请求。 SOAP UI中的正确请求是:

肥皂网址:http://example.com:8181/inventory/soap/inventory-api?wsdl

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:inv="http://example.com:8181/inventory-api/">
   <soapenv:Header/>
   <soapenv:Body>
      <inv:searchStockItemRequest>
         <inv:filter>
            <inv:ItemID>100</inv:ItemID>
            <inv:ItemID>101</inv:ItemID>
            <inv:ItemID>102</inv:ItemID>
         </inv:filter>
      </inv:searchStockItemRequest>
   </soapenv:Body>
</soapenv:Envelope>

这意味着:搜索ID为100或101或102的StockItem。 这是我目前的代码。

$xml = '<inv:filter>
            <inv:ItemID>100</inv:ItemID>
            <inv:ItemID>101</inv:ItemID>
            <inv:ItemID>102</inv:ItemID>
         </inv:filter>';
$client = new SoapClient(null, array(
    'location' => 'http://example.com:8181/inventory/soap/inventory-api?wsdl',
    'uri' => MCA_INVENTORY_WSDL)
);
$result = $client->searchItem(htmlspecialchars($xml));

结果是错误的消息:

&#34;缺少必需的元素{http://example.com:8181/inventory-api/}过滤器&#34;

我认为服务器无法检测到上面的过滤元素。有人请帮忙!!!

2 个答案:

答案 0 :(得分:0)

Soap URL: http://example.com:8181/inventory/soap/inventory-api?wsdl

这是您的wsdl地址,而不是您的服务端点网址。

在网络浏览器中打开上面的网址。在wsdl中找到此标记<soap:address location>。它应该在wsdl末尾的<service>标记内。现在用这个终点url替换wsdl url。 它应该工作。

$client = new SoapClient(null, array(
'location' => 'http://example.com:8181/inventory/soap/inventory-api?wsdl',
'uri' => MCA_INVENTORY_WSDL)

答案 1 :(得分:0)

我认为你必须使用正确的数据格式而不是XML字符串。根据您使用SOAP UI的正确请求,使用SoapClient的代码应如下所示:

$client = new SoapClient('http://example.com:8181/inventory/soap/inventory-api?wsdl');
$result = $client->searchStockItemRequest(array(
    'filter' => array(
        'ItemID' => array(100, 101, 102)
    )
));

我不确定ItemID数组格式是否正确。您可以打印要检查的请求:

echo $client->__getLastRequest();

不要忘记启用跟踪选项:

 $client = new SoapClient('...', array('trace' => true));