Рассмотрим пример сценария клиента 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()
или другие соответствующие функции.