3

次のようなメッセージを受け入れるように WSDL によって構成された SOAP サーバーを (PHP で) 構築しています。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://my.awesome.namespace/">
    <SOAP-ENV:Header>
        <ns1:Header>
            <ns1:APIKey>E4C5BDE0-48DC-543C-1CA3-8E55C63F8E60</ns1:APIKey>
            <ns1:SiteID>111</ns1:SiteID>
        </ns1:Header>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:Heartbeat>
            <ns1:Message>Hello world.</ns1:Message>
        </ns1:Heartbeat>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAPServer でハートビート メッセージを処理するのに問題はありませんでした。問題なく$server->addFunction("Heartbeat");動作します。ただし、エンクロージャーのコンテンツを処理できるようにしたい<ns1:Header>ので、API キーとサイト ID を検証して、それらが本来あるべきものであることを確認できます。

私はここを見ました(そしてもちろん他の場所も)が、応答者は質問の要点を見逃しているようです. ヘッダー要素にアクセスして検証する方法を知っている人はいますか? ボディにメソッドを追加するのと同じように、ヘッダーに関数を追加しますか? ( $server->addFunction("Header");?)

よろしくお願いします。

4

1 に答える 1

7

それを見つけた!これがあなたがすることです。

SOAP サーバーを作成します。

$server = new SoapServer($your_wsdl,$any_options);
$server->setClass($name_of_your_class);
$server->handle($location_of_request_data);

で名前が付けられたクラスには$name_of_your_class、で定義された各サービスの関数が含まれているだけでなく、タグ エンクロージャ$your_wsdlにあるものに対応する名前の関数も含まれている必要があります。<SOAP-ENV:Header><ns1:Header>あるので、関数の名前はHeaderです。そこに必要なロジックを入れてください。私の場合、API キーとサイト ID を検証したかったので、プライベート変数を作成し、API キーとサイト ID が正しければ、変数は true に設定されます。クラス内の他のすべての関数は、続行する前にその変数が true かどうかを確認し、そうでない場合は aSOAPFaultがスローされます。

これが、Google でこの質問に出くわしたすべての人に役立つことを願っています。

PS: で定義されているクラスの関数については$server->setClass()、WSDL で定義されている順序で引数を受け入れる必要があることを忘れないでください。それは私をつまずかせました。

他のすべての PHP/SOAP 開発者の皆さん、頑張ってください。私たち全員がそれを必要としているようです。

編集/PPS: 何らかの理由で、単に電話をかけるだけで$server->addFunction("Header")はうまくいきませんでしたsetClass.上記のアプローチを試す前に、最初にそれを試しました. 皆様へのお知らせです。

于 2009-12-22T22:18:53.733 に答える