У меня есть следующий код:
$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));
Там $ 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>
Как я могу это достичь?
PS: PHP 5.2.6-3ubuntu4.5 с Suhosin-Patch 0.9.6.2 (cli) (построено: 6 января 2010 22:25:33)
Заранее спасибо!
Недавно я попал в похожий сценарий, и я обнаружил, что этот шаблон обычно делает трюк.
$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);
Исправлено его, расширяет SoapClient и переопределяет метод __doRequest (), где я изменяю запрос как descibed здесь: http://www.php.net/manual/en/soapclient.dorequest.php#57995
Для меня ужасно страшно, но он работает «прямо здесь, прямо сейчас».
$telnums=array(10, 20, 30); $createDomainRequest=array('createDomainRequest' => array( 'telnums' => $telnums) );