Осмотреть 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");
затем переходит в вызов как параметр "Лицо" = > $Person;
и несколько других. Но каждый раз, когда я получаю ошибку
SoapException: сервер не смог запрос процесса --- > System.Exception: Требуется человек. при имени службы.
Чтобы продолжить устранение неполадок, я хотел бы увидеть XML-документ, который отправляется, чтобы увидеть, создает ли он сложный тип, каким я его ожидаю.
Я создаю службу, используя $client = new SoapClient('wsdldoc.asmx?WSDL');
, вызывающую ее с помощью $client->CreateUser($params);
, а затем пытаюсь ее увидеть с помощью функции $client->__getLastRequest();
, но она никогда не попадает в __getLastRequest, потому что она вызывает фатальную ошибку при вызове CreateUser ($ params).
Вопрос снова:
Есть ли способ просмотреть XML, созданный вызовом CreateUser ($ params) БЕЗ фактической отправки и возникновения фатальной ошибки
Ответы
Ответ 1
Замечание по началу работы. Чтобы успешно использовать метод __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 при отладке вашей проблемы.
Ответ 2
Я нашел эту ветку, работая над одной и той же проблемой, и был обманут, потому что я использовал классы, которые уже расширили класс SoapClient() и не хотели слишком много шуметь. Однако, если вы добавляете тег "exceptions" = > 0 при запуске класса, он не будет генерировать Fatal Error (хотя он будет печатать исключение):
SoapClient($soapURL,array("trace" => 1,"exceptions"=>0));
Это позволило мне запустить __getLastRequest() и проанализировать XML, который я отправлял.
Ответ 3
Я не верю, что вы сможете увидеть любой создаваемый XML... главным образом потому, что функция не работает, пытаясь создать/передать его.
Не уверен, что вы уже пробовали, но если у вас возникли проблемы с попыткой решить, что именно вам нужно передать в функцию, которую вы можете использовать:
$клиент → __ getTypes();
http://us3.php.net/manual/en/soapclient.gettypes.php
Надеюсь, это поможет!