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

Как сбросить запрос SoapClient для отладки?

Мне нужно отладить код, использующий мыльный клиент. Я нашел getLast * методы в php.net, но когда я пытаюсь получить последний запрос для отладки, он возвращает NULL

<?php

    $client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL");

    $response = $client->ChangePowerUnit(array(
        "PowerValue" => 100,
        "fromPowerUnit" => "horsepower",
        "toPowerUnit" => "megawatts"
    ));


    echo "====== REQUEST HEADERS =====" . PHP_EOL;
    var_dump($client->__getLastRequestHeaders());
    echo "========= REQUEST ==========" . PHP_EOL;
    var_dump($client->__getLastRequest());
    echo "========= RESPONSE =========" . PHP_EOL;
    var_dump($response);

?>

Результат выполнения кода:

$php soap_test.php 

====== REQUEST HEADERS =====
NULL
========= REQUEST ==========
NULL
========= RESPONSE =========
object(stdClass)#2 (1) {
  ["ChangePowerUnitResult"]=>
  float(0.0746)
}

Как получить содержимое тела и заголовков последнего запроса SoapClient?

4b9b3361

Ответ 1

Отладка запроса SOAP

  1. Использование расширения SOAP

Самый простой и лучший * способ отладки запроса SOAP действительно создать расширение SOAP, который регистрирует запрос необработанного SOAP и необработанный ответ SOAP от клиента службы веб - службы или Web, используя следующие функции SoapClient класса:

Чтобы заставить его работать, вам нужно создать объект SoapClient с включенной опцией trace, как упоминалось в xdazz:

$client = new MySoapClient($wsdlUrl, array('trace' => 1));

а затем запустите ваши вызовы SOAP, завернутые в блок try-catch:

try{
   $result = $client->__SoapCall('routeCase', $params);
}catch (\Exception $e){
   throw new \Exception("Soup request failed! Response: ".$client->__getLastResponse());
}

При разработке SOAP-решений на PHP также рекомендуется очистить папку PHP tmp при изменении контракта WSDL (см. Путь к папке tmp в phpinfo()), чтобы заставить PHP SoapClient загружать файлы WSDL и XSD снова, вместо использования кешированные файлы (до истечения срока их действия).

Кроме того, полезно устанавливать такие параметры, как exceptions и cache_wsdl и версию soap_version при разработке:

$options = array( 
    'soap_version'=>SOAP_1_2, 
    'exceptions'=>false, 
    'trace'=>1, 
    'cache_wsdl'=>WSDL_CACHE_NONE 
);

*Недопустимость отладки с использованием расширения SOAP заключается в том, что ошибки сертификата происходят до фактического запроса или чего-то еще.Таким образом, невозможно использовать getLastRequest() или getLastResponse(), когда есть некорректное подключение.

  1. Использование Xdebug

Еще один интересный вариант для отладки SoapClient - это установка файла cookie отладки для Xdebug и вашей любимой среды IDE

$client = new SoapClient(
    'http://example.loc/index.php/api/v2_soap/?wsdl'
);
$client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
  1. Использование специализированного SOAP Tracer & Debugger

Специализированные приложения SOAP Trace & Debug также очень полезны: помимо обычных подозреваемых, таких как SoapUI, есть также промежуточные прокси-серверы, такие как Charles, как описано здесь. Недостатком этого метода является то, что добавлено больше уровней и, следовательно, могут возникнуть новые проблемы, например проблемы с рукопожатием.

Есть также некоторые коммерческие отладчики SOAP, которые стоят денег, таких как XML Spy SOAP Debugger или SOAPSonar, которые выполняют валидацию и вызов. В любом случае SoapUI всегда хороший компаньон.

Если вы подозреваете, что на уровне сетевого протокола есть проблема, попробуйте Wireshark, анализатор сетевых протоколов для Unix и Windows.

Журналы, журналы, журналы

Основная информация об ошибках также может быть найдена в журнале PHP и журнале веб-сервера. Убедитесь, что вы включили полную регистрацию ошибок.

Ответ 2

Эти функции работают только в том случае, если был создан объект SoapClient с параметром трассировки, установленным в TRUE.

Try:

$client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL", array('trace' => 1));

Ответ 3

Я просто завершаю его для действия:

$client = new \SoapClient("http://127.0.0.1/services/wsdl2",array('trace' => 1,));
try{
   $result = $client->__SoapCall('routeCase', $params);
}catch (\Exception $e){
   throw new \Exception("Soup Request Failed! Response:\n".$client->__getLastResponse());
}