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

Как я могу увидеть фактический 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-запрос.

4b9b3361

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