Осмотреть XML, созданный вызовом PHP SoapClient до / без отправки запроса

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

задний план:

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

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

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

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

SoapException: сервер не смог обработать запрос —> System.Exception: Person обязательно. на имя службы.

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

Вопрос еще раз: есть ли способ просмотреть XML-файл, созданный вызовом CreateUser ($ params) WITHOUT, фактически отправив его и вызвав фатальную ошибку

Предварительное замечание. Чтобы успешно использовать метод __getLastRequest() , вы должны установить для параметра «трассировка» значение 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 во время отладки вашей проблемы.

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

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

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

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

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

$ Клиент -> __ getTypes ();

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

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