Как посмотреть фактический XML, сгенерированный клиентским классом PHP SOAP? - PullRequest
50 голосов
/ 26 августа 2010

Рассмотрим этот пример клиентского скрипта 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-запрос.

Ответы [ 7 ]

102 голосов
/ 26 августа 2010

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

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

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

$SOAP = new SoapClient($WDSL, array('trace' => 1));
16 голосов
/ 12 октября 2010
$SOAP = new SoapClient($WSDL, array('trace' => true));

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

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

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

14 голосов
/ 07 апреля 2014

Если вы хотите просмотреть запрос без фактического установления соединения, вы можете переопределить метод __doRequest SoapClient для возврата 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);
9 голосов
/ 13 августа 2014

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

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);
}
}
6 голосов
/ 26 августа 2010

Вам необходимо включить трассировку при создании 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

3 голосов
/ 26 августа 2010

если вы работаете с клиентом локально, Fiddler - это отличный способ реализации сообщений для просмотра сообщений в сети.

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

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

1 голос
/ 12 мая 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...