php SoapClient - 在请求中使用多个根标签进行调用

时间:2014-03-05 11:53:36

标签: php soap soap-client

这是我想要实现的xml结构:

<?xml version="1.0" encoding="ISO-8859-1"?>
  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns1:method>
      <auth>
        ...
      </auth>
      <data>
        ...
      </data>
    </ns1:method>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
</XML>

我的代码:

<?php
$client = new SoapClient(null, array('location' => "http://www.test.com/soap.php",
                                     'uri'      => "http://tempuri.org/",
'trace' => true,'exceptions' => true,'cache_wsdl' => WSDL_CACHE_NONE));

$request = new stdClass();
$request->auth = new stdClass();
$request->data = new stdClass();

$client->__soapCall("method", array($request));

请注意:SoapClient不允许我在__soapCall方法的第二个参数中插入除数组以外的任何内容。

所以,这就是我得到的:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns1:method>
      <param0 xsi:type="SOAP-ENC:Struct">
        <auth xsi:type="SOAP-ENC:Struct"/>
        <data xsi:type="SOAP-ENC:Struct"/>
      </param0>
    </ns1:method>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如您所见,php为我的请求添加了一个根标记 - param0。有没有办法逃避这个?我需要2&#34; root&#34;该请求参数中的元素。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

你是否尝试过这种方式:$client->__soapCall("method", $request);

答案 1 :(得分:0)

感谢大家的回答。我在SoapParam的帮助下解决了这个问题:

$client->__soapCall("method", array(
    new SoapParam($request->auth, "auth"),
    new SoapParam($request->data, "data"),
));