Вопрос: есть ли способ просмотра 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
Надеюсь это поможет!