SoapClient: как передать несколько элементов с одинаковыми именами? - PullRequest
8 голосов
/ 01 сентября 2010

У меня есть следующий код:

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

Как мне этого добиться?

P.S .: PHP 5.2.6-3ubuntu4.5 с Suhosin-Patch 0.9.6.2 (cli) (сборка: 6 января 2010 22:25:33)

Заранее спасибо!

Ответы [ 6 ]

14 голосов
/ 03 октября 2014

Недавно я столкнулся с подобным сценарием и обнаружил, что этот шаблон обычно помогает.

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

Причина, по которой это работает, заключается в том, что он тесно эмулирует ту же структуру данных, как предписано вашим WSDL

8 голосов
/ 03 июня 2011

Правильный ответ должен был быть:

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

:)

1 голос
/ 05 января 2015

Боль в ягодице - найти рабочее решение, но в конце концов это не так сложно. Даже на удивление легко и аккуратно с помощью SoapParam's:

$soapClient = new SoapClient($wsdl);
$soapClient->__call('createDomain', array(
    new SoapParam('10', 'telnums'),
    new SoapParam('20', 'telnums'),
    new SoapParam('30', 'telnums'),
));
0 голосов
/ 14 августа 2017

Вот формат кода, который я использовал:

$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);
0 голосов
/ 17 мая 2017
$telnums=array(10, 20, 30);
$createDomainRequest=array('createDomainRequest' => array(
  'telnums' => $telnums)
);
0 голосов
/ 02 сентября 2010

Исправлено с помощью extends SoapClient и переопределяет метод __doRequest (), где я изменяю запрос, как здесь описано:

выглядит ужасно для меня, но работает "прямо здесь, прямо сейчас".

...