PHP5 SOAP Request - параметр ассоциативного массива не отправляется - PullRequest
1 голос
/ 27 октября 2011

Я пишу этот скрипт на php для выполнения SOAP-запроса:

<?php
try {  
    $soapCli = new SoapClient('somewsdl', array('trace' => 1)); 
    print_r(
        $soapCli->__soapCall(
            "getUserByCf", array("xxx" => 'ok', "cf" => 'notok')
        )
    );
    echo "REQUEST HEAD:\n" . $soapCli->__getLastRequestHeaders() . "\n";
    echo "REQUEST:\n"      . $soapCli->__getLastRequest()        . "\n";
    unset($soapCli);
} catch (SoapFault $e) {  
    print_r($e);  
} 
?>

Но на моем wsdl первый параметр - cf (а не xxx).Итак, XML Respost сервера имеет вид:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:ns1="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns1:getUserByCf>
      <cf xsi:type="xsd:string">ok</cf>
      <xxx xsi:type="xsd:string">notok</xxx>
    </ns1:getUserByCf>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

2 параметр переключен.

Почему, если параметр _soapCall() равен

"Массив аргументов для передачи в функцию. Это может быть либо упорядоченный, либо ассоциативный массив."

И я делаю ассоциативный массив, запросне ассоциативно?

Почему мылоКолл не ассоциирует 2 параметра, а переключает и ассоциирует параметр 1 ° с именем 1 ° на WSDL и 2 ° с 2 °?

1 Ответ

0 голосов
/ 15 декабря 2012

Вы используете ассоциативный массив для параметров. Это означает, что вы используете именованные параметры. Именованные параметры не имеют порядка, у них есть имя. Порядок не важен.

Если вы хотите использовать неназванные параметры, вы можете сделать это, не используя ассоциативный массив, а просто используя числовые индексы, начиная с нуля:

    $soapCli->__soapCall(
        "getUserByCf", array('ok', 'notok')
    )

Обратите внимание, что это чаще всего не работает, поскольку многие службы требуют именованных параметров.

...