Как я могу увидеть фактический XML, созданный PHP SOAP Client Class?
Рассмотрим этот пример SOAP Client script:
$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-запрос.
Ответы
Ответ 1
Используйте getLastRequest
. Он возвращает XML, отправленный в последнем запросе SOAP.
echo "REQUEST:\n" . $SOAP->__getLastRequest() . "\n";
И помните, этот метод работает, только если объект SoapClient был создан с опцией trace
, установленной на TRUE
. Поэтому при создании объекта используйте этот код:
$SOAP = new SoapClient($WDSL, array('trace' => 1));
Ответ 2
$SOAP = new SoapClient($WSDL, array('trace' => true));
$Response = $SOAP->DoRemoteFunction($Data);
echo "REQUEST:\n" . htmlentities($SOAP->__getLastRequest()) . "\n";
это не будет печатать последний запрос, но также делает теги xml видимыми в браузере
Ответ 3
Если вы хотите просмотреть запрос без фактического соединения, вы можете переопределить метод SoapClient __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);
Ответ 4
Расширение ответа Quinn, вы также можете просто зарегистрировать запрос перед выполнением запроса.
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);
}
}
Ответ 5
Вам нужно включить трассировку при создании 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
Ответ 6
если вы используете локальный клиент, Fiddler - отличный способ реализации сообщений на проводнике. /p >
Если вы используете его удаленно, вы можете использовать что-то вроде Apache TCPMON Автономный или через eclipse *
* просто связывается с первым хитом Google
Ответ 7
Проблема с ответом Quinn Comendant, что $request
from __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()
или другие соответствующие функции.