1

私は Web サービスに不慣れで、2 つのパラメーターを受け取る Web サービス (できれば SOAP ベース) を作成する設計上の問題に直面しています。

  • 文字列変数 (クライアント名);
  • XML データ。

現在、この Web サービスには 2 つの異なるコンシューマーがいますが、その数は増える予定です。すべてのコンシューマーは、送信する個別の XSD データを持っています。次に例を示します。

コンシューマー1:

<ConData>
    <Customer>
        <FirstName>FirName</FirstName>
        <LastName>LasName</LastName>
    </Customer>
    <Acocunt>
        <Number>112971</Number>
    </Account>
    <Order>
        <OrderNum>0092123</OrderNum>
    </Order>
<ConData>

コンシューマ 2:

<ConData>
    <SysData>
        <CustomerFirstName>Name</CustomerFirstName>
        <CustomerLastName>Name</CustomerLastName>
        <AccountNumber>Au1o2n</AccountNumber>
        <OrderNum>koo912</OrderNum>
    </SysData>
<ConData>

この Web サービスは、これらのクライアントから XML データを取得し、コンシューマー名に基づいてデータベースに格納することになっています。XML 自体を検証するために必要な処理はありません。XML を取得してデータベースに保存するだけです。

ただし、良い設計として、明示的なパラメーターを使用して Web サービスを定義したいと考えています。問題は、それらの XML データ形式が異なるため、単一の XSD スキーマを WSDL のパラメーターとして使用できないことです。これに対処するための 2 つのオプションを考えることができます。

1. XSD マッピング パラメータではなく、Web サービスで XML データを文字列として渡すようにします。これは有効なアプローチですが、検証が無効になり、多くの手動のマーシャリングとアンマーシャリングおよびその他の問題が必要になるため、これまでフォーラムで読んだことに基づくと、悪い設計のように思えます。さらに、私の WSDL は、期待される形式などをクライアントに定義することができません。

2. 独自の XSD を持つ異なる個々のコンシューマーを処理する 2 つの別個の Web サービスを作成します。将来的にコンシューマーを追加する場合、同じ操作のための重複したコードを含む新しい Web サービスを追加する必要があるため、これも実行可能性が低いように思われます。

単一の Web サービス WSDL で複数の XSD を定義する方法があるかどうか、またはこの問題を解決するためのより良い方法があるかどうかを調べていました。

余談ですが、私は SOAP ベースの Web サービスを使用したいと考えていますが、RESTful Web サービスを使用してこの問題がより適切に解決される場合は、それも検討できます。

4

1 に答える 1

2

クライアントごとに異なる Web サービスやスケルトンを用意する必要はありません。必要なのは、異なる WSDL だけです

この XML パラメーターを文字列として送信することは忘れてください。これについては既にお読みになっているので、ここでは繰り返さないという欠点があります。そのため、XML として送信する必要があります。

<xsd:any>これを 1 つの Web サービスに保持するには、任意の XML を入力 (パラメーターの型) として受け入れるように Web サービスを作成します。型<xsd:any>とは、あらゆる種類の XML を意味しますが、少なくとも、最初に構造を検証できるのは XML です。

これにより、別の XML タイプの入力を追加するときにコードを変更する必要がないため、Web サービスのバージョン管理が簡素化されますが、残念なことに、Web サービスの厳密な型指定が失われ、Web サービス用に生成された WSDL は、Web サービスの構造について何も述べていません。期待している XML (XML はあいまいすぎる)。Web サービス スケルトンは、コード内の 、 などObjectのタイプで作成されます。すべてのクライアント スタブでも同じことが起こります。XmlElementXmlDocument

ただし、クライアントの場合、各クライアントに異なる WSDL を提供することで、WSDL からこれを修正できます。

そのためには、<types>セクションを除くすべてのクライアントに共通のコンテンツを含む Web サービスの WSDL を作成し、各クライアントのこの共通の WSDL を独自の XML スキーマとマージします。次に、クライアントごとに異なる URL で各 WSDL を公開します。

これで、クライアントは独自の特定の WSDL に基づいて、厳密に型指定されたスタブを生成できるようになります。

クライアントが Web サービスを呼び出すと、クライアントの XML スキーマを識別し、それを使用して XML パラメーターを検証し、それが期待されるコンテンツかどうかを確認します。

そして、上記が多すぎると思われる場合は、いつでも緩く型付けされた RESTful Web サービスを選択できます。ただし、どのソリューションを選択する場合でも、送信元のクライアントのスキーマを使用して受信 XML を検証するようにしてください。

于 2012-09-02T16:12:06.990 に答える