programing

PHP SOAP Client Class에서 생성된 실제 XML을 보려면 어떻게 해야 합니까?

telebox 2023. 8. 15. 11:01
반응형

PHP SOAP Client Class에서 생성된 실제 XML을 보려면 어떻게 해야 합니까?

다음 SOAP Client 스크립트 예제를 참조하십시오.

$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을 확인해야 합니다.

사용합니다. 마지막 SOAP 요청에서 보낸 XML을 반환합니다.

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

또한 이 메서드는 SoapClient 개체가 다음을 사용하여 생성된 경우에만 작동합니다.trace옵션 설정TRUE따라서 개체를 만들 때 다음 코드를 사용합니다.

$SOAP = new SoapClient($WDSL, array('trace' => 1));
$SOAP = new SoapClient($WSDL, array('trace' => true));

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

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

이렇게 하면 마지막 요청이 인쇄될 뿐만 아니라 XML 태그가 브라우저에 표시됩니다.

실제로 연결하지 않고 요청을 보려면 SoapClient를 무시할 수 있습니다.__doRequestXML을 반환하는 방법:

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);

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

SoapClient를 생성할 때 추적을 활성화해야 합니다.이와 같은 경우:

$SOAP = new SoapClient($WSDL, array('trace' => true));

$Data = array('Something'=>'Some String','SomeNumber'=>22); 

그런 다음 XML을 확인하기 위해 서비스 호출을 한 후 __getLastRequest 메서드를 호출합니다.

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

요청 XML을 출력합니다.

더 읽기: http://www.php.net/manual/en/soapclient.getlastrequest.php

클라이언트를 로컬로 실행하는 경우 Fiddler는 구현에 구애받지 않고 유선의 메시지를 볼 수 있는 훌륭한 방법입니다.

원격으로 실행하는 경우 Apache TCPMON Standalone 또는 eclipse*와 같은 기능을 사용할 수 있습니다.

*Google의 첫 번째 히트작에 링크하기만 하면 됩니다.

코멘던트의 대답의 문제는,$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()또는 기타 관련 기능.

언급URL : https://stackoverflow.com/questions/3572414/how-do-i-see-the-actual-xml-generated-by-php-soap-client-class

반응형