2009-03-27 9 views
3

サードパーティアプリケーションへのSOAP呼び出しをいくつか実行しています。アプリケーションが期待するものの例として、このソープヘッダーを提供しています。 PHPでこのようなSOAPヘッダーを作成するにはどうすればよいですか?どうすればこのようなソープヘッダーを作成できますか?

<SOAP-ENV:Header> 
    <NS1:Security xsi:type="NS2:Security" xmlns:NS1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:NS2="urn:dkWSValueObjects"> 
     <NS2:UsernameToken xsi:type="NS2:TUsernameToken"> 
      <Username xsi:type="xsd:string">XXXX</Username> 
      <Password xsi:type="xsd:string">XXX</Password> 
     </NS2:UsernameToken> 
    </NS1:Security> 
</SOAP-ENV:Header> 

私は私が何のヘッダが送信されなかったことが正しいコールであると引き換えに得続ける考えて何をすべきか。

ここは私のコードのサンプルです。

class SOAPStruct 
{ 
    function __construct($user, $pass) 
    { 
     $this->Username = $user; 
     $this->Password = $pass; 
    } 
} 

$client = new SoapClient("http://www.example.com/service"); 

$auth = new SOAPStruct("username", "password"); 
$header = new SoapHeader("http://example.com/service", "TUsernameToken", $auth); 

$client->__setSoapHeaders(array($header)); 
$client->__soapCall("GetSubscriptionGroupTypes", array(), NULL, $header) 

これは私が戻ってくるSOAPヘッダーです。 PHPでの取り扱い

<SOAP-ENV:Header> 
    <ns2:TUsernameToken> 
     <Username>username</Username> 
     <Password>password</Password> 
    </ns2:TUsernameToken> 
</SOAP-ENV:Header> 
+0

Webサービス用のWSDL/XSDからPHPオブジェクトとサービスインタフェースを生成できる、SOAPハンドリング用のPHPライブラリはありませんか? – JeeBee

+0

私はPHPでSOAPClientライブラリを使用しています。 –

答えて

3

SOAPヘッダは実際には非常に柔軟ではないと私は、ヘッダー内の特に使用の2つの名前空間が作るだろうと言って限り行くだろう(そのより多くが、私は敏感であるかもしれない離れて情報を剥奪しました)何らかのタイプの構造体を単に使用してヘッダを挿入することは不可能です。

これを処理する最善の方法は、SoapClientを拡張するカスタムクラスでSoapClient::__doRequest()をオーバーライドすることによって、XMLリクエストを自分自身で形成することです。

class My_SoapClient extends SoapClient 
{ 
    public function __doRequest($request, $location, $action, $version, $one_way = 0) 
    { 
     $xmlRequest = new DOMDocument('1.0'); 
     $xmlRequest->loadXML($request); 

     /* 
     * Do your processing using DOM 
     * e.g. insert security header and so on 
     */ 

     $request = $xmlRequest->saveXML(); 
     return parent::__doRequest($request, $location, $action, $version, $one_way); 
    } 
} 

詳細およびいくつかの例については、SoapClient::__doRequestを参照してください。

+0

私は最終的に自分のヘッダーを作成しましたが、nuSOAPを使用しましたが、あなたの答えは正しい方法で私を導きました。 :) –

関連する問題