Вызов PHP Soap без WSDL: как вы передаете параметры?

Я пытаюсь сделать не-WSDL-вызов в PHP (5.2.5) следующим образом. Я уверен, что упускаю что-то простое. Этот вызов имеет один параметр, строку, называемую «часовой пояс»:

    $URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';

    $client = new SoapClient(null, array(
        'location' => $URL,
        'uri'      => "http://www.Nanonull.com/TimeService/",
        'trace'    => 1,
        ));

// First attempt:
// FAILS: SoapFault: Object reference not set to an instance of an object
   $return = $client->__soapCall("getTimeZoneTime",
       array(new SoapParam('ZULU', 'timezone')),
       array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
    );

// Second attempt:
// FAILS: Generated soap Request uses "param0" instead of "timezone"
   $return = $client->__soapCall("getTimeZoneTime",
       array('timezone'=>'ZULU' ),
       array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
   );

Спасибо за любые предложения
-Дэйв


person Dave C    schedule 29.05.2009    source источник
comment
Обратите внимание, что uri — это пространство имен, SoapClient будет называть его ns1. См. этот ответ stackoverflow.com/a/959339/475876   -  person Akira Yamamoto    schedule 02.05.2019


Ответы (4)


Спасибо. Вот полный пример, который теперь работает:

$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';

$client = new SoapClient(null, array(
    'location' => $URL,
    'uri'      => "http://www.Nanonull.com/TimeService/",
    'trace'    => 1,
    ));

$return = $client->__soapCall("getTimeZoneTime",
   array(new SoapParam('ZULU', 'ns1:timezone')),
   array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
person Dave C    schedule 06.06.2009

Решение @Dave C не сработало для меня. Оглядевшись, я нашел другое решение:

$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';

$client = new SoapClient(null, array(
    'location' => $URL,
    'uri'      => "http://www.Nanonull.com/TimeService/",
    'trace'    => 1,
    ));

$return = $client->__soapCall("getTimeZoneTime",
   array(new SoapParam(new SoapVar('ZULU', XSD_DATETIME), 'timezone')),
   array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);

Надеюсь, это может помочь кому-то.

person Norberto Soriano    schedule 05.05.2011

Проблема кроется где-то в отсутствии информации о пространстве имен в параметре. Я использовал первый случай вашего примера, так как он был ближе всего к тому, что я придумал.

Если вы измените строку:

array(new SoapParam('ZULU', 'timezone')),

to:

array(new SoapParam('ZULU', 'ns1:timezone')),

это должно дать вам ожидаемый результат.

person ylebre    schedule 06.06.2009

Вы можете попробовать добавить еще один вызов array() вокруг ваших параметров следующим образом:

$params = array('timezone'=>'ZULU' );
$return = $client->__soapCall("getTimeZoneTime",
    array($params),
    array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);

Я не могу проверить это, но вы можете.

person Peter Stuifzand    schedule 29.05.2009
comment
Пробовал, но он передает весь массив как param0. Так что не ходи. - person Dave C; 30.05.2009