IT이야기

디버그를 위해 SoapClient 요청을 덤프하는 방법

cyworld 2021. 10. 8. 21:08
반응형

디버그를 위해 SoapClient 요청을 덤프하는 방법은 무엇입니까?


비누 클라이언트를 사용하는 코드를 디버깅해야 합니다. php.net에서 getLast* 메소드를 찾았지만 디버그에 대한 마지막 요청을 얻으려고 하면 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 요청의 본문 및 헤더 내용을 가져오는 방법은 무엇입니까?


SOAP 요청 디버그

  1. SOAP 확장 사용

SOAP 요청을 디버그하는 가장 쉽고 좋은 * 방법 SoapClient 클래스 의 다음 기능을 사용하여 웹 서비스 또는 웹 서비스 클라이언트에서 원시 SOAP 요청과 원시 SOAP 응답을 기록 하는 SOAP 확장 을 만드는 것입니다 .

작동하게 하려면 xdazz에서 언급한 것처럼 추적 옵션이 켜진 SoapClient 개체를 만들어야 합니다.

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

그런 다음 try-catch 블록으로 래핑된 SOAP 호출을 실행합니다.

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

PHP에서 SOAP 솔루션을 개발할 때 WSDL 계약이 변경될 때 PHP tmp 폴더를 정리하여( tmp폴더 경로 참조 phpinfo()) PHP SoapClient가 캐시된 파일을 사용하는 대신 WSDL 및 XSD 파일을 다시 다운로드하도록 하는 것도 좋습니다 만료됨).

또한 개발하는 동안 exceptionscache_wsdlsoap_version버전 같은 옵션을 설정하는 것이 유용합니다 .

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

* SOAP 확장을 사용하여 디버깅할 때의 단점은 실제 요청이나 다른 것보다 먼저 인증서 오류가 발생한다는 것입니다. 따라서 일종의 연결 실패가 있는 경우 getLastRequest() 또는 getLastResponse()를 사용할 수 없습니다.

  1. Xdebug 사용

SoapClient를 디버그하는 또 다른 흥미로운 옵션은 Xdebug 및 즐겨 사용하는 IDE에 대한 디버그 세션 쿠키를 설정하는 것입니다.

$client = new SoapClient(
    'http://example.loc/index.php/api/v2_soap/?wsdl'
);
$client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
  1. 특수 SOAP 추적기 및 디버거 사용

특수 SOAP 추적 및 디버그 앱도 매우 유용합니다. SoapUI 와 같은 일반적인 용의자 외에 여기에 설명된 Charles와 같은 중간 추적 프록시도 있습니다 . 이 방법의 단점은 더 많은 레이어가 추가되어 핸드셰이크 문제와 같은 새로운 문제가 발생할 가능성이 있다는 것입니다.

There are also some commercial SOAP Debuggers out that are worth the money, like the XML Spy SOAP Debugger or SOAPSonar which do validation and invocation. In any event, SoapUI is always a good companion.

If you suspect there is an issue on the network protocol level try Wireshark, a network protocol analyzer for Unix and Windows.

Logs, logs, logs

Basic error information can also be found in the PHP log and the web server log. Ensure you have turned on full error logging.


These functions only works if the SoapClient object was created with the trace option set to TRUE.

Try:

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

I just wrap it up for action:

$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());
}

ReferenceURL : https://stackoverflow.com/questions/14030228/how-to-dump-soapclient-request-for-debug

반응형