Исчезновение param0 в запросе Soap в PHP с использованием класса SoapClient - PullRequest
2 голосов
/ 28 сентября 2010

Я пытаюсь вызвать веб-сервис из кода PHP, используя SoapClient.

$service = new SoapClient($wsdl);
$service->myFunction('something', 'anotherthing', 'onemore');

Если я включу трассировку и получу последний запрос, я вижу, что первый параметр всегда отсутствует в сообщении Soap, т. Е. param0 никогда не существует. То же самое в функциях с меньшим или большим количеством параметров.

Запрос на мыло:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <myFunction />
    <param1>anotherthing</param1>
    <param2>onemore</param2>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Что я ожидаю (и что мой веб-сервис принимает при использовании soapUI):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <myFunction>
      <param0>something</param0>
      <param1>anotherthing</param1>
      <param2>onemore</param2>
    </myFunction>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

То же самое с

__soapCall('myFunction', array($something, $anotherthing, $onemore));

Я использую xampplite в Windows XP.

Обновление: http://programming.itags.org/php/236781/ - ссылка на кого-то с такой же проблемой (опубликовано в 2008 году без ответов :().

Обновление 2: я также заметил, что он не помещает элементы xml, представляющие параметры, в качестве дочерних элементов элемента, представляющего функцию. Это не может быть правдой? !!?

Я сделал ужасное исправление, где я перегружаю функцию __doRequest и редактирую переменную $ request. Это работает, но это отстой. Я мог бы также скомпилировать весь запрос сам ......

Обновление 3: мне кажется, что PHP просто работает со сбоями. Но если бы это была ошибка в реализации мыла, я бы подумал, что в Интернете было бы больше информации об этом. Aaaargh. Следующая попытка - попробовать NuSoap и PEAR.

Обновление 4: для округления я не пробовал NuSoap и PEAR. Я просто пошел со своим «хаком», потому что он работал, и были другие действия, которые нужно было выполнить. Кроме того, демонстрация была дана и для следующего этапа PHP больше не будет использоваться. Таким образом, все это будет заново реализовано в любом случае.

Ответы [ 2 ]

2 голосов
/ 28 января 2011

TL; DR версия: вы неправильно вызываете свой метод SOAP. Поместите параметры в массив, а не в качестве отдельных аргументов для PHP __call ().

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

$soapclient = new SoapClient($uri);
$soapclient->MethodName($param0, $param1, $param2);

Что любопытно, создает SOAP XML примерно так:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<MethodName/>
<param1>$param1</param1>
<param2>$param2</param2>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

То, что я должен был сделать, было названо так:

$soapclient = new SoapClient($uri);
$soapclient->MethodName(array($param0, $param1, $param2));

Это создает SOAP XML следующим образом:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<MethodName>
<param0>$param0</param0>
<param1>$param1</param1>
<param2>$param2</param2>
</MethodName>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Оглядываясь назад, довольно очевидно - но я вижу, как я ошибочно принял параметры SOAP за то, что они также являются параметрами PHP!

0 голосов
/ 28 сентября 2010

Вы можете увидеть, что отправляет SoapClient, расширив метод doRequest и отладив аргумент $request.

В качестве альтернативы, SoapClient :: __ getLastRequest также может быть использовано, но у меня были некоторые проблемы в прошлом, когда мои вызовы генерировали исключение (то есть: не соответствуют WDSL), в doRequest вы Можно проверить XML перед отправкой.

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

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