2016-08-12 11 views
6

私は、標準のPHP SoapClientを使用してSoapServerのメソッドにアクセスしようとしているところに問題があります。問題は、SoapServerのメソッドが同じ名前で2回リストされているが、アクションが異なることです。PHP SoapClientはWSDLモードでSoapActionを再マップしますか?

たとえば、SOAP UIではGetStockQuoteとGetStockQuoteが2回表示されますが、2番目のGetStockQuoteは実際にGetStockQuoteV2を呼び出す予定です。

私のPHP SoapClientは、$ client-> GetStockQuoteを呼び出すと、最初のものが自動的に呼び出されます。私の研究から、私は代わりにこのような何かをしなければなりません。

$client->__soapCall('GetStockQuote', array($request), array('soapaction'=>'GetStockQuoteV2')); 

私がwsdl-modeになっても、GetStockQuoteV2ではなくGetStockQuoteが呼び出されます。

私の結論は、私は非wsdlモードで動作し、その煩わしさに対処しなければならないということでした。非wsdlモードでは、上記の__soapCallが正しいメソッドを呼び出すように見えますが、私は非wsdlモードなので、サーバーに必要な適切なAuthHeaderを構築することに問題があると思います。

私の質問は、PHP SoapClient wsdl-modeの中でsoapアクションを再マップできますか?

+0

アプリケーションを開発するときに常にキャッシュを無効にしてsoapクライアントを実行します。 $ client = new SoapClient( 'http://somewhere.com/?wsdl'、array( 'cache_wsdl' => WSDL_CACHE_NONE));あなたのwsdlファイルを共有するかもしれません。また、無効なWS-I準拠のSOAPを使用していて、WS-I準拠モードを有効にしている場合は、両方のwsdlファイルが異なります。 –

答えて

2

これは醜い回避策ですが、ここで見てきたように、あなたは別の面に醜いソープサービスを持っています。

  1. テイクWSDLのURL
  2. は、それを保存、ローカルファイルとして
  3. そして、そこのメソッドの順序を変更します(これらの悪いが第一でなければなりません)

別の解決策。 SoapClientを拡張することができ、メソッドAは実際にリモートメソッドBを呼び出します。

+0

はい、SoapClientのメソッドをオーバーライドすることは、この問題を処理する最もクリーンな方法のようです。私は変更wsdlを維持する必要はありません。 – Halfstop

関連する問題