Подтвердить что ты не робот

Осмотреть 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) БЕЗ фактической отправки и возникновения фатальной ошибки

4b9b3361

Ответ 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

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