Проверять XML, созданный вызовом PHP SoapClient, до / без отправки запроса - PullRequest
38 голосов
/ 26 октября 2009

Вопрос: Есть ли способ просмотреть XML, который будет создан с помощью вызова функции PHP SoapClient ДО того, как вы действительно отправите запрос?

фон:

Я новичок в WSDL-коммуникации, и у меня есть клиент, который хочет, чтобы я развивался на PHP, способ взаимодействия со службой WSDL, написанной на ASP.NET. Я получил довольно далеко, но сталкиваюсь с проблемой, когда речь идет о прохождении сложного типа. До сих пор я пробовал несколько разных вещей.

1) Настройка одного массива, например $params->Person->name $params->Person->address

2) Настройка одного массива $Person = array('name'=>"joe",'address' = "123");

затем переходя в вызов в качестве параметра "Person" => $ Person; и несколько других. Но каждый раз, когда я получаю ошибку

SoapException: серверу не удалось запрос процесса ---> System.Exception: Человек требуется. на имя службы.

Чтобы продолжить устранение неполадок, я хотел бы увидеть отправляемый XML-документ, чтобы увидеть, создает ли он сложный тип так, как я этого ожидаю. Я создаю службу, используя $client = new SoapClient('wsdldoc.asmx?WSDL');, вызывая ее с помощью $client->CreateUser($params);, а затем пытаюсь увидеть ее с помощью функции $client->__getLastRequest();, но она никогда не попадает в __getLastRequest, поскольку при вызове CreateUser ($ params) возникает фатальная ошибка.

Снова вопрос: Есть ли способ просмотреть XML, созданный вызовом CreateUser ($ params), БЕЗ его фактической отправки и фатальной ошибки

Ответы [ 3 ]

80 голосов
/ 26 октября 2009

Предварительное замечание: Чтобы успешно использовать метод __getLastRequest(), необходимо установить для параметра 'trace' значение true в конструкции клиента:

$client = new SoapClient('wsdldoc.asmx?WSDL', array('trace' => TRUE));

Таким образом, ваш запрос все равно будет отправлен (и, следовательно, все равно не выполнен), но вы можете проверить отправленный xml после , позвонив $client->__getLastRequest().


Основной ответ:

Чтобы получить доступ к сгенерированному XML до / без отправки запроса, вам необходимо создать подкласс SoapClient, чтобы переопределить метод __doRequest():

class SoapClientDebug extends SoapClient
{
  public function __doRequest($request, $location, $action, $version, $one_way = 0) {
      // Add code to inspect/dissect/debug/adjust the XML given in $request here

      // Uncomment the following line, if you actually want to do the request
      // return parent::__doRequest($request, $location, $action, $version, $one_way);
  }
}

Вы бы тогда использовали этот расширенный класс вместо исходного SoapClient при отладке вашей проблемы.

8 голосов
/ 08 января 2013

Я нашел этот поток, работая над той же проблемой, и был в замешательстве, потому что я использовал классы, которые уже расширили класс SoapClient () и не хотели слишком много с ним обходиться. Однако если вы добавите тег «exceptions» => 0 при запуске класса, он не выдаст фатальную ошибку (хотя и выведет исключение):

SoapClient($soapURL,array("trace" => 1,"exceptions"=>0));

Это позволило мне запустить __getLastRequest () и проанализировать отправляемый мной XML.

1 голос
/ 26 октября 2009

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

Неконечно, если вы уже пробовали, но если у вас возникли проблемы с попыткой решить, что именно вам нужно передать в функцию, которую вы можете использовать:

$ client -> __ getTypes ();

http://us3.php.net/manual/en/soapclient.gettypes.php

Надеюсь, это поможет!

...