web-dev-qa-db-ja.com

PHP SOAP Client Class?

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を確認する必要があります。

50
Nick

getLastRequest を使用します。最後のSOAP要求で送信されたXMLを返します。

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

また、このメソッドが機能するのは、traceオプションをTRUEに設定してSoapClientオブジェクトが作成された場合のみです。したがって、オブジェクトを作成するときは、次のコードを使用します。

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

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

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

これは最後のリクエストを印刷しませんが、ブラウザでxmlタグを表示します

16
Shankky

実際に接続せずにリクエストを表示したい場合は、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);
14
Quinn Comendant

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

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

6
Ezequiel Muns

クライアントをローカルで実行している場合、 Fiddler は、ワイヤ上のメッセージを見るための優れた実装に依存しない方法です。

リモートで実行している場合は、 Apache TCPMONStandalone または Eclipse *を使用できます。

* Google からの最初のヒットにリンクするだけ

3
Pratik Bhatt

Quinn Comendant's answerの問題。__doRequest()からの_$request_が__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()または他の関連する関数を呼び出さないためです。

1
Gino Pane