5

サードパーティと統合する SOAP アプリケーションを開発しています。このサードパーティの WSDL は非常に奇妙だと思います。私は SOAP にかなり慣れていないので、壊れていなければ修正を依頼したくありません。技術的には有効なドキュメントであると確信していますが、これについて間違っていると私が気づいたことがいくつかあります (したがって、タイトルに「ベスト プラクティス」と書いたのはそのためです)。また、私は SOAP ライブラリとして gSOAP を使用しています。これが、これらのいくつかが奇妙だと思う理由かもしれません (一般的な SOAP よりも gSOAP の方が新しいのです)。

  1. 同じ WSDL に SOAP 1.1 と SOAP 1.2 の両方に指定されたインターフェースがあります。1.2 しか使用しないため、これにより gSOAP は必要なクラスの 2 倍を生成します。

  2. 名前空間はすべてhttp://tempuri.org. そんなはずないですよね?

  3. 多数の RPC 呼び出しを定義しているにもかかわらず、彼らの WSDL はドキュメント形式を使用しています。gSOAP ではドキュメント形式に C++ の型付きパラメータを取るメソッドが生成されないようなので、RPC 形式に切り替えてもらいたいと考えています。代わりに、すべての API 関数の入力および応答データに対して新しいクラスを作成します。修正できない場合は、gSOAP をラップする別のレイヤーを作成して、アプリの残りの部分に適切な API を提供する必要があります。また、AFAICT、行き来する XML は RPC に切り替えれば今とまったく同じになるので、難しいことはないと思います。

  4. 要素には minOccurs = 0 がありますが、要素なしでリクエストを送信すると、要素が必要であることを示すエラーが返されます (場合によっては、null ポインター例外のスタック トレースさえあります)。必要な場合は、minOccurs = 1 と指定する必要がありますよね?

  5. ほとんどすべての Web サービス関数は、成功を示す整数 (実際にはブール値) とエラー メッセージ文字列を含む応答を指定します。これには SOAP フォールトを使用する必要がありますか? gSOAP を使用すると、それを非常に簡単に把握できる (そして、エラー メッセージを簡単に出力できる) ため、障害が発生した場合、アプリケーションが処理しやすくなると思います。

もちろん、私が依頼したからといって、このサードパーティ企業が WSDL を変更することを期待しているわけではありません。少なくとも私は何かを学ぶだろう... 私が知っている限りでは、これらのどれも間違っていないし、疑わしいことさえない. ご協力いただきありがとうございます。

4

6 に答える 6

3

1 - 彼らはおそらくこれを機能と考えています。:-)

2 - それはひどいです。

3 - 多くの人がこれを推奨しています。ラップ形式と呼ばれます。

4 - その通りです。

5 - それは場合によります。理論的にはおそらくあなたの言う通りですが、実際には多くの SOAP ツールキットが SOAP エラーを適切にサポートしていないため、意図的に例外を使用しないことを選択した可能性があります。

于 2008-11-11T23:26:09.773 に答える
2

あなたがインターフェースしようとしているサードパーティもWebサービスを知らないように私には聞こえます。

あなたの説明から、それはMicrosoft ASP.NET Webサービスの実装の非常に典型的なように聞こえます、サードパーティは彼らが提供しなければならないものをインターフェースするために小さなVBまたはC#を書き、それをASP.NETサーバーにプッシュし、それに応じて1日呼び出しますASP.NETエンジンで、要求に応じてWSDLを自動生成します。

あなたは彼らにSOAP1.1定義を提供しないように頼むことができますが、彼らは方法を知らないので、彼らがあなたを助けるとは思いません。名前空間がtempuri.orgである理由を尋ねることができます。彼らが本当に言いたいのは「そうですか?」というとき、彼らの応答は「それを調べなければならない」のようなものになると確信しています。理由もわからないからです。

名前空間はコード内のコンパイラ指令によって制御され、tempuri.orgはMicrosoftのデフォルトです(atm申し訳ありませんと呼ばれるものを思い出さないでください)。もちろん、名前空間の値は、変数名解決のための一意の文字列識別子を提供することだけを目的としているため、(奇妙に見えることを除けば)それほど重要ではありません。たぶん、他のものも同様の方法で制御できるかもしれません。私にはわかりません。WebサービスやASP.NETなど、テクノロジーの大ファンではありません。

于 2008-11-13T20:04:06.773 に答える
1

Encounter this just now and find that must write the prefix correctly , the prefix must be a work follow TWO continus underscore 'youtns__methodname"

for example

typedef double xsd_double;
int ns__add(xsd_double a, xsd_double b, xsd_double &result);
int ns__sub(xsd_double a, xsd_double b, xsd_double &result);
int myns__sqrt(xsd_double a, xsd_double &result);

this will generate two wsdl file after run soapcpp2: ns.wsdl and myns.wsdl

But is you define you method like this ( one underscore )

int ns_add(xsd_double a, xsd_double b, xsd_double &result); // wrong 

the spapcpp2 will generate nothing.

于 2011-03-11T03:24:22.093 に答える
1

まず、実際に WSDL を作成する人はいません (ツールによって生成されます)。ベンダーのツールは、おそらく名前空間に正しい URL を挿入し、V1.0、V1.1、Both というラジオ ボタンを持っている可能性があります。ベンダーはおそらく既存の非 SOAP コードをいくつか持っていて、いくつかのツールを使用してそれらを SOAP サービスとしてラップしていました。

誰も WSDL を作成しないので、読むべきではありません。適切なツール セットを入手してください。SOAPUI のようなものが WSDL をデコードし、頭が爆発することなく閲覧できるようにします。その Java ですが、コーディングする言語に関係なく、最高のテスト ツールです。

私の SOA 経験は主に Java であり、ライブラリーとツールに関する限り、選択の余地がありません。C++ はおそらくこの分野では成熟していませんが、問題は WSDL ではなくツールの選択にあるようです。現実の世界では、完全ではない WSDL が提示されるため、ツールは妥当な方法でそれを処理できる必要があります。

于 2008-11-18T15:38:21.067 に答える
0

あなたが遭遇したのは、Web サービスを作成する際の典型的なサード パーティの怠惰です。それらについて推論しようとしてもうまくいかないだろうと思いますが、WSDL を手動で編集して 1.1 の定義を削除することはできます。

于 2008-11-11T23:39:11.307 に答える