SoapClient: how to pass multiple elements with same name?

爱⌒轻易说出口 提交于 2019-11-26 20:59:23

问题


I have following code:

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

There $this->client is an instance of SoapClient class.

And it generates following request:

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

But I need

            <createDomainRequest>
                <telnums>10</telnums>
                <telnums>20</telnums>
                <telnums>30</telnums>
            </createDomainRequest>

How I can achieve this?

P.S.: PHP 5.2.6-3ubuntu4.5 with Suhosin-Patch 0.9.6.2 (cli) (built: Jan 6 2010 22:25:33)

Thanks in advance!


回答1:


I had landed into a similar scenario recently and I found this pattern usually does the trick.

$obj = new StdClass();
foreach ($telnums as $telnum) {
    $obj->telnums[] = $telnum;
}

The reason this works is because it closely emulates the same data structure as prescribed by your WSDL




回答2:


The correct answer should have been:

$options = array(
  'createDomainRequest' => array(
    'telnums' => array(
      '10',
      '20',
      '30'
    )
  )
);

:)




回答3:


It is a pain in the buttock to find a working solution, but eventually it's not that hard. Even surprisingly easy and neat by using SoapParam's:

$soapClient = new SoapClient($wsdl);
$soapClient->__call('createDomain', array(
    new SoapParam('10', 'telnums'),
    new SoapParam('20', 'telnums'),
    new SoapParam('30', 'telnums'),
));



回答4:


Here is the code format that I used:

$wsdl = 'https://your.api/path?wsdl';
$client = new SoapClient($wsdl);
$multipleSearchValues = [1, 2, 3, 4];
$queryData = ['yourFieldName' => $multipleSearchValues];
$results = $client->YourApiMethod($queryData);
print_r($results);



回答5:


Fixed it by extends SoapClient and overrides __doRequest() method where I modify request as descibed here: http://www.php.net/manual/en/soapclient.dorequest.php#57995

Looks terrible for me, but it works "right here, right now".




回答6:


$telnums=array(10, 20, 30);
$createDomainRequest=array('createDomainRequest' => array(
  'telnums' => $telnums)
);


来源:https://stackoverflow.com/questions/3617398/soapclient-how-to-pass-multiple-elements-with-same-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!