Вызов PHP Soap без WSDL: как передать параметры? - PullRequest
10 голосов
/ 30 мая 2009

Я пытаюсь сделать не-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')
   );

Спасибо за любые предложения
-Dave

Ответы [ 4 ]

11 голосов
/ 06 мая 2011

@ Решение Дэйва Си не сработало для меня. Оглядываясь вокруг, я нашел другое решение:

$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')
);

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

10 голосов
/ 07 июня 2009

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

$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')
);
5 голосов
/ 06 июня 2009

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

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

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

до:

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

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

0 голосов
/ 30 мая 2009

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

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

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

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