Как я могу увидеть фактический XML, созданный PHP SOAP Client Class?

Рассмотрим пример сценария клиента SOAP:

$SOAP = new SoapClient($WDSL); // Create a SOAP Client from a WSDL // Build an array of data to send in the request. $Data = array('Something'=>'Some String','SomeNumber'=>22); $Response = $SOAP->DoRemoteFunction($Data); // Send the request. 

В последней строке PHP принимает аргументы из указанного вами массива и, используя WSDL, строит XML-запрос для отправки, а затем отправляет его.

Как я могу заставить PHP показать мне фактический XML, который он построил?

Я искал приложение и должен видеть фактический XML-запрос.

Используйте getLastRequest . Он возвращает XML, отправленный в последнем запросе SOAP.

 echo "REQUEST:\n" . $SOAP->__getLastRequest() . "\n"; 

И помните, что этот метод работает только в том случае, если был создан объект SoapClient с параметром trace установленным в TRUE . Поэтому при создании объекта используйте этот код:

 $SOAP = new SoapClient($WDSL, array('trace' => 1)); 
 $SOAP = new SoapClient($WSDL, array('trace' => true)); $Response = $SOAP->DoRemoteFunction($Data); echo "REQUEST:\n" . htmlentities($SOAP->__getLastRequest()) . "\n"; 

это не будет печатать последний запрос, но также сделает заметки xml видимыми в браузере

Если вы хотите просмотреть запрос без фактического соединения, вы можете переопределить метод __doRequest чтобы вернуть XML:

 class DummySoapClient extends SoapClient { function __construct($wsdl, $options) { parent::__construct($wsdl, $options); } function __doRequest($request, $location, $action, $version, $one_way = 0) { return $request; } } $SOAP = new DummySoapClient('http://example.com/?wsdl', array('trace' => true)); echo $SOAP->GetRequestDetail($params); 

Расширяя ответ Куинна, вы также можете просто зарегистрировать запрос перед выполнением запроса.

 class SoapClientDebug extends SoapClient { public function __doRequest($request, $location, $action, $version, $one_way = 0) { error_log("REQUEST:\n" .$request . "\n"); error_log("LOCATION:\n" .$location . "\n"); error_log("ACTION:\n" .$action . "\n"); error_log("VERSION:\n" .$version . "\n"); error_log("ONE WAY:\n" .$one_way . "\n"); return parent::__doRequest($request, $location, $action, $version, $one_way); } } 

Вам нужно включить отслеживание при создании вашего SoapClient. Вот так:

 $SOAP = new SoapClient($WSDL, array('trace' => true)); $Data = array('Something'=>'Some String','SomeNumber'=>22); 

Затем вызовите метод __getLastRequest после того, как вы сделали вызов службы, чтобы увидеть XML.

 $Response = $SOAP->DoRemoteFunction($Data); echo $SOAP->__getLastRequest(); 

Это выведет XML запроса.

Дополнительная информация: http://www.php.net/manual/en/soapclient.getlastrequest.php

если вы запускаете клиент локально, Fiddler – отличный способ агностического поиска информации о проводах.

Если вы используете его удаленно, вы можете использовать что-то вроде Apache TCPMON Standalone или через eclipse *

* просто ссылка на первый хит из Google

Проблема с ответом Quinn Comendant , что $request от __doRequest() будет обрабатываться __call() и пользователь увидит массив параметров вместо реального запроса xml. Чтобы предотвратить это, можно использовать такое обходное решение:

 class DummySoapClient extends SoapClient { function __construct($wsdl, $options) { parent::__construct($wsdl, $options); } function __doRequest($request, $location, $action, $version, $one_way = 0) { throw new Exception($request); } function __call($function_name, $arguments) { try { parent::__call($function_name, $arguments); } catch (Exception $e) { return $e->getMessage(); } } } 

trace здесь не нужна, потому что мы не вызываем __getLastRequest() или другие соответствующие функции.