6

phpを使用してSOAPでWebサービスと通信しています。これが私のコードです:

$data = array('name' => 'test', 'age' => 20);
$WDSL = 'http://xxx.xxxxx.xxx/wdsl.ibs?wsdl';
$SOAP = new SoapClient($WDSL, array('trace' => true));
$RESULT = $SOAP->__soapCall('Some_Service', $data);

何らかの理由で、XMLが間違っています:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Some_Crap"><SOAP-ENV:Body><ns1:Some_Service/><param1>test</param1><param2>20</param2> ...

XMLノード名が変数名である必要があるのになぜparamXになるのですか?私は何が間違っているのですか?

ありがとう

更新:そのWebサービスの関数をリストしましたが、取得できるのは次のとおりです。

Some_Service_Response Some_Service(Some_Service $parameters))

電話を変更したので、今は:

$SOAP->__call('Some_Service', array('Some_Service', $data));

そして、XMLはまだ間違っています:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="urn:iwaysoftware:ibse:jul2003:HR_Master"><SOAP-ENV:Body><ns1:Some_Service/>
<param1><item><key>SomeKey</key><value>SomeValue</value> ....

私はまだ得ます <param1><item><key>SomeKey</key><value>SomeValue</value> instead of <Somekey>SomeValue</Somekey>

だから問題は、Webサービスが正しく機能していないのか、それとも私の側にあるのかということです。

4

2 に答える 2

9

このSoapClientクラスは、サービスのWSDLに基づいて多くの修正を行います。たとえば、無効なタグを削除します。WSDLを確認してください。パラメータの名前がとである可能性がparam1ありparam2ます。

結果を呼び出しSoapClient::__getFunctions()SoapClient::__getTypes()ダンプすると、PHPがWSDLから理解したことのかなり良い要約が得られます。


(OPが更新された後、の出力の質問SoapClient::__getFunctions()は次のとおりです。

Some_Service_Response Some_Service(Some_Service $parameters))

)。

通常、配列キーはタイプではなくパラメータ名です。だから私の最初の推測は次のようになります:

$SOAP->__call('Some_Service', array('parameters', $data));

ただし、問題はサーバー側にある可能性があります。WSDLの非互換性により、PHPが必要な同じXMLを出力するように、WSDLファイルを手動で調整する必要がある場合があります。

ただし、ハッキングを行う前に(機会があれば)、PHPを使用せずにサービスを試して、さまざまなXMLファイルに対するサービスの反応を確認してください。SoapUIと呼ばれる優れたプログラムがこれを実行でき、テストするXMLスタブを自動的に生成します。(デジタル署名が必要なWebサービスのSoapUIでのみ問題が発生しました。)

XMLテストの結果に基づいて、次のことが必要になる場合があります。

  • WSDLを手動で調整する
  • 手作業でXMLファイルを生成し、それをWebサーバーに送信します(最後の手段)
  • XMLがほぼ正しい場合は、クラスから派生し、サーバーに送信する前に(基本クラスのを呼び出すことによって) XMLファイルで文字列操作を行うメソッドをSoapClientオーバーライドすることもできる小さな微調整が必​​要です。一例として、WebサービスがいくつかのタグでいくつかのXML属性を再送信する必要があるときにこのソリューションを使用したとき。SoapClient::__doRequest__dorequest
于 2013-01-16T16:36:17.027 に答える
5

もし私があなたなら、オブジェクト形式で$dataを設定してみます。

$data = array('name' => 'test', 'age' => 20);

例えば:

$data = null;
$data->name = "test";
$data->age = 20;

$RESULT = $SOAP->__soapCall('Some_Service', $data);
于 2013-02-03T17:31:24.593 に答える