SoapClient:如何传递多个具有相同名称的元素?

Sla*_*hin 8 php soap soap-client

我有以下代码:

$telnums = array(10, 20, 30);
$obj = new StdClass();
$obj->telnums = new StdClass();
foreach ($telnums as $telnum) {
    $obj->telnums = $telnum;
}

call_user_func(array($this->client, 'createDomain'), new SoapVar($obj, SOAP_ENC_OBJECT));
Run Code Online (Sandbox Code Playgroud)

$ this-> client是SoapClient类的一个实例.

它会生成以下请求:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="...">
    <SOAP-ENV:Body>
        <ns1:createDomain>
            <createDomainRequest>
                <telnums>30</telnums>
            </createDomainRequest>
        </ns1:createDomain>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)

但是我需要

            <createDomainRequest>
                <telnums>10</telnums>
                <telnums>20</telnums>
                <telnums>30</telnums>
            </createDomainRequest>
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

PS:PHP 5.2.6-3ubuntu4.5与Suhosin-Patch 0.9.6.2(cli)(内置:2010年1月6日22:25:33)

提前致谢!

小智 15

我最近陷入了类似的情况,我发现这种模式通常可以解决问题.

$obj = new StdClass();
foreach ($telnums as $telnum) {
    $obj->telnums[] = $telnum;
}
Run Code Online (Sandbox Code Playgroud)

这样做的原因是它密切模拟了WSDL规定的相同数据结构


den*_*zer 8

正确的答案应该是:

$options = array(
  'createDomainRequest' => array(
    'telnums' => array(
      '10',
      '20',
      '30'
    )
  )
);
Run Code Online (Sandbox Code Playgroud)

:)

  • 只是它不会产生符合问题所述的XML.如果您可以控制解析结束,此方法可以正常工作,但通常远程服务往往非常明确,并且不能很好地处理文档结构中的变体. (3认同)
  • 这实际上是错误的,因为它导致:<createDomainRequest> <telnums> <0> 10 </ 0> <1> 20 </ 1> <2> 30 </ 2> </ telnums> </ createDomainRequest> (2认同)
  • 我有,它产生的 XML 输出就像我在最初的评论中写的那样。也许某些远程服务旨在接受这种差异,但我遇到的大多数远程服务都没有。在订阅 SOAP 服务时,WSDL 准确描述了 XML 元素的排序方式。不幸的是,PHP 的内置 SoapClient 受到 PHP 关联数组的限制,因为您不能添加多个同名的键。解决它的唯一方法(我目前知道)是事后修改 XML 文档。 (2认同)

Sla*_*hin -1

通过扩展 SoapClient 并覆盖 __doRequest() 方法修复了它,我在其中修改请求,如下所述: http: //www.php.net/manual/en/soapclient.dorequest.php#57995

对我来说看起来很糟糕,但它“就在此时此地”有效。