3

これが私がしようとしている呼び出しです:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <urn:SessionHeader  xmlns:urn="http://www.mywebservice.com/webservices/SoapService" xmlns="http://www.mywebservice.com/webservices/SoapService" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <urn:sessionId xmlns:urn="http://www.mywebservice.com/webservices/SoapService">LOGINTOKEN=your instance name</urn:sessionId>
    </urn:SessionHeader>
</soap:Header>
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <ns2:login xmlns:ns2="http://www.mywebservice.com/webservices/SoapService">
        <wsUser>
            <entityId>0</entityId>
            <password>your password</password>
            <username>your username</username>
        </wsUser>
    </ns2:login>
</soap:Body>

しかし、PHP5 の Soap でカスタム ヘッダーを設定する方法を見つけるのに苦労しています。nuSoap を使用すると、すべてを変数に入れてから使用できます$client->setHeader($headerVar)が、PHP で同様のものを見つけることができません。この 1 つの呼び出しを再現できれば、残りを理解できます。どんな助けでも大歓迎です!

前もって感謝します!

更新: チュートリアルを次々と実行し、PHP ドキュメントを読みましたが、何も機能していないようです。curl (および nuSoap) でやりたいことはできますが、ネイティブの PHP5 Soap の方が簡単で、おそらくより安定していると思いました。私はそうではないと思います...

更新2 ここに私が試しているコードがあります:

$soapurl = 'http://www.mywebservice.com/webservices/SoapService?wsdl';
$client = new SoapClient($soapurl,array('trace'=>true));
$token = "LOGINTOKEN=your instance name";

$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token));
$client->__setSoapHeaders($header);


$client->login(array("wsUser" => array('entityId'=>'0','username'=>'my username','password'=>'my password')));

そして、私が得るエラー:

**Fatal error**: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header in C:\www\soap\index.php:12 Stack trace: #0 C:\www\soap\index.php(12): SoapClient->__call('login', Array) #1 C:\www\soap\index.php(12): SoapClient->login(Array) #2 {main} thrown in C:\www\soap\index.php on line 12

Update 3 したがって、「sessionId」が「キー」として送信され、トークンが「値」として送信されているようです。

 *REQUEST*:
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.mywebservice.com/webservices/SoapService">
<SOAP-ENV:Header>
<ns1:SessionHeader><item><key>sessionId</key><value>LOGINTOKEN=my token</value></item>
</ns1:SessionHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body><ns1:login><wsUser><entityId>0</entityId><password>my password</password><username>my username</username></wsUser></ns1:login></SOAP-ENV:Body></SOAP-ENV:Envelope>
4

1 に答える 1

2

ヘッダーを作成するために SoapHeader クラスを試しましたか? このようなものは機能しますか?

//Assume $token holds your login token and $client holds the SoapClient object
$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token));
$client->__setSoapHeaders($header);

これにより、ヘッダーが作成され、SoapClient に追加されます。その後、SoapClient を使用するすべての呼び出しで、そのヘッダーが設定されます。正確なフォーマットに関しては、あまり心配しません。XML のサンプルでは、​​urn という名前空間のエイリアスを使用しています。PHP はおそらくまったく同じエイリアスにはなりませんが、それでも動作するはずです。また、すべての子要素で xmlns を宣言する必要はないと思います。子ノードは XML でその親の名前空間を自動的に継承すると思いますが、それについては 100% 確実ではありません。肝心なのは、正しい URL が名前空間で宣言されている限り、XML が例と完全に一致しなくても問題ないということです。

もう 1 つ試すことができることは、SoapClient でトレースをオンにしましたか? これは、コンストラクターに渡すことができるパラメーターの 1 つであり、XML SOAP 要求と応答を表示できます。それでも SoapHeader クラスを使用しても機能しない場合は、トレースをオンにして、何が送受信されているかを確認してください。

于 2011-02-13T21:32:00.727 に答える