SoapClient: как передать несколько элементов с одинаковым именем?
у меня есть следующий код:
$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 является экземпляром класса 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>
но мне нужно
<createDomainRequest>
<telnums>10</telnums>
<telnums>20</telnums>
<telnums>30</telnums>
</createDomainRequest>
как я могу добиться этого?
P.S.: PHP 5.2.6-3ubuntu4.5 с Сухосин-патчем 0.9.6.2 (cli) (построен: Jan 6 2010 22:25:33)
спасибо заранее!
6 ответов
недавно я попал в аналогичный сценарий, и я обнаружил, что этот шаблон обычно делает трюк.
$obj = new StdClass();
foreach ($telnums as $telnum) {
$obj->telnums[] = $telnum;
}
причина этого заключается в том, что он близко эмулирует ту же структуру данных, что и ваш WSDL
правильный ответ должен быть:
$options = array(
'createDomainRequest' => array(
'telnums' => array(
'10',
'20',
'30'
)
)
);
:)
это боль в ягодице, чтобы найти рабочее решение, но в конечном итоге это не так сложно. Даже удивительно легко и аккуратно, используя Soapparam's:
$soapClient = new SoapClient($wsdl);
$soapClient->__call('createDomain', array(
new SoapParam('10', 'telnums'),
new SoapParam('20', 'telnums'),
new SoapParam('30', 'telnums'),
));
вот формат кода, который я использовал:
$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);
исправлено с помощью extends SoapClient и переопределяет метод _ _ doRequest (), где я изменяю запрос, как описано здесь:http://www.php.net/manual/en/soapclient.dorequest.php#57995
выглядит ужасно для меня, но он работает "прямо здесь, прямо сейчас".
$telnums=array(10, 20, 30);
$createDomainRequest=array('createDomainRequest' => array(
'telnums' => $telnums)
);