2009-08-25 30 views
5

PHPアプリケーションから特定のユーザーを探すためにWebサービスを使用しようとしています。私はASP.NETでまったく同じWebサービスを成功させて使用しました。PHP 5 SOAPクライアントは、WSDL提供関数が呼び出されたときにNULLを返します。

基本的に、私はPHPのdocのようにすべてを行い、私はASP.NETで(Webサービス自体のために)使用したものと同じメソッド/変数を使用しますが、結果が得られないようです。

関数は(__getFunctionsにリストされている)とanyTypeを返す必要があり、私が正しく理解していれば、PHPでmixedの等価である:

array(1) { [0]=> string(63) "anyType basicSearch(string $sharedSecret, string $searchParams)" } 

私はbasicSearchを(呼び出して実行すると)しかし、リターンがNULLと思われます。

basicSearch()は、情報を含むXMLドキュメントを返すことになっています。 ASP.NETでは、私は単純にXmlDocumentに対する応答を投げかけていました。私もPHPでそれを行う必要がありますか? XML文書(SimpleXML、DOMなど)の表現は?

PHPがフォーマットを理解できないため、NULLと表示されますか?

PHPで何か問題が起きていますか?または、Webサービス自体を調べて、その側でデバッグしようとする必要がありますか?

PS:私はPHP 5ライブラリを使用しています。多分ヌー・ソープのような他のライブラリを使用すると助けになるでしょうか?それについてもっとオンラインのdocがあるようです。


更新:動作しないパラメータを渡すために、配列を使用しては

、SOAPは別々の引数を期待しています。 __getLastRequest()を呼び出すと、他のXMLを持たない$ keyと$ reqを連結した文字列を返します。 __getLastResponse()を呼び出すと、空の文字列が返されます。まったく例外はスローされません。 PHPは、私が__getFunctions()を呼び出すときに使用する関数を取得するので、WSDLファイルを解析しても、私が与えた引数をどうすればいいのかわかりません。

ご協力いただければ幸いです。

更新 ':解決策はまだありません。私はうんざりしています...

+0

配列をエコーすると、配列が文字列に変換されるため、常に「配列」が得られます。 print_r()またはvar_dump()を使用してみてください。 –

+0

うん、今私は正しい関数が表示されます。ありがとう、私はそれを実際に知っていて、それを逃した。問題が更新されました。 –

+0

コード例では、クライアントによってスローされる可能性のある例外はチェックされません。そうでない場合は、try/catchを使ってそのチェックを追加することをお勧めします。役立つエラーメッセージが表示される可能性があります。 –

答えて

4

私はこの全部が、PHPでSoapClientライブラリを使用し始めたときにかなり混乱していました。次のようにこのようなものをフォーマットする適切な方法は次のとおりです。

$client = new SoapClient($wsdl_url, array("trace" => 1)); 

$params = array(
    "sharedSecret" => "thisIsSomeSecret", 
    "searchParams" => "thisIsSomeSearchParam" 
); 

$response = $client->basicSearch($params); 

応答を見なければ、私はリターン・パラメータを参照する方法を伝えることはできませんが、その保存方法は、stdClassのオブジェクトのメンバーVARようです。あなたがこのようなリターンを参照するように...

$ reponse-> paramName;参照するには

素敵なトリックあなたが続ければ、アレイそこにオプションの(「トレース」=> 1)のセットは、あなたがこの2つの関数を呼び出すことができるということです....

$respXML = $client->__getLastResponse(); 
$requXML = $client->__getLastRequest(); 

...その実際のxmlが送信され、その正しい形式かどうかを確認します。慎重に、SoapClientはかなりバギーです。しかし、ヌサップよりもはるかに優れています。ゴミ箱に行ってはいけません。

+1

私はnotation/formatの発言には同意しません:主に非WSDLの使用を意図した '$ client - > __ soapCall($ functionName、$ arguments)' mehtodを使用する場合にのみ、引数を配列として渡します。 WSDLを使用する場合は、関数がOPと同じように、引数を別々に渡して関数を名前で直接呼び出す必要があります。 –

+0

しかし、トレースオプションと__getLastRequest()を使用して実際の戻り値をチェックすることに同意します。 –

+0

Henrik Opelが述べたように、配列メソッドは機能していないようです。 PHPは不足しているパラメータが必要であると不平を言っています。 私はtraceと__getLastRequest()と__getLastResponse()を使用すると、PHPが自分の要求と何をするべきかを知らなかったかのように、最初のパラメータと2番目の要求を連結して、応答として空の文字列を返します。 __getFunctions()を呼び出すと、私が使用している関数が返されるので、WSDLが読み込まれます。この全体が混乱します。 –

1

yeap

$クライアント=新しいのSoapClient($のWSDL_URL、配列( "トレース" => 1));

"trace"パラメータが役に立ちます

関連する問題