15

そのため、私はWebサービスに少し慣れていません。最近、クライアントに返されるデータ型に要素を追加するという状況が発生しました。クライアントは、これが予期していなかった新しい要素を窒息させたため、実装が壊れたと不満を漏らしました。(私たちはAxis2を介してサービスを提供しています)。

私には、これはクライアントが適切に処理できるはずの無害な変更のように思えます(オプションの情報を追加することが完全に受け入れられるいくつかの非Webサービスフレームワークで作業しました)。クライアントに問題を引き起こす可能性のあるいくつかのフィールドを削除または名前変更したかどうかは理解できました。

基本的に、wsdlがインターフェースのように機能することを期待します。基本的にそのインターフェイスをサブタイプ化する変更を行う場合、クライアントは無関係な要素を喜んで無視することを期待します。これはWebサービスの単なる短所なのか、それとも古いクライアントが自由に更新できるように新しいクライアントが追加のデータを取得できるようにサービスに受動的な変更を加えるための正しい方法がありますか?

4

4 に答える 4

10

WSDL は実際には、インターフェースというよりも契約として機能します。WSDL は、操作が何を「受信」し、何を「返す」かを正確に記述します。これに最も近い類推は、C で関数自体を変更せずに関数のプロトタイプを変更することです。それらは一致せず、問題が発生します。

WSDL がより具体的であるほど、適切な動作が「保証」されます。

返されるデータに柔軟性が必要な場合 (つまり、フィールドの追加/削除など)、次のいずれかを実行できます。

  1. 古いバージョンを新しいバージョンにリダイレクトできる WSDL 定義とパブリッシュ サービスをバージョン管理する
  2. XML などのより抽象的なデータの戻り値の型を使用して、複雑さや変化するデータを隠します。

2 には多少のリスクがありますが、XSD やその他のテクノロジで管理できます。特定のプロジェクト要件によって、何が受け入れられるかが決まります。

于 2009-12-17T20:14:48.303 に答える
4

WSDL は事実上、Web サービスの公開された SOAP インターフェースです。多くのクライアントはこれを使用して、選択したプログラミング言語ですべての Web サービス メソッドを公開するクライアント プロキシを生成します。これらのコード生成クライアントのほとんどは非常に壊れやすく、認識できない (つまり WSDL にない) 要素を見つけた場合、それを無視するのではなく、例外をスローすることを選択します。一部はよりリラックスしており、実際には使用するクライアント テクノロジに依存します。つまり、Microsoft の新しい DataContract はクライアントに IExtensibleData インターフェイスを持ち、認識しないデータを明確に保持するため、未知の要素をほとんど無視します。

SOAP およびコード生成のクライアント プロキシは、関心のある部分だけではなく「スキーマ全体」を理解したいクライアントを生成するため、この種の問題に適しています。別の方法は、Xml パーサーを使用して単にプルすることです。必要なビットを取り出します。

Web サービスが開発中または絶え間なく変更されている場合、SOAP は実際には最良の選択ではありません。SOAP は、変更のたびにサービス クライアントを再生成、再構築、および再デプロイする必要があることを意味します。状況によっては、代わりに REST+POX (Plain Old Xml) Web サービスを提供することを検討することをお勧めします。これは、SOAP のオーバーヘッドがなく、通常の URL を介して呼び出すことができ、環境によって消費されるため、解析が簡単だからです。 SOAPClient ライブラリを持っていない (例: AJAX を使用してブラウザーで直接)

于 2010-02-09T10:01:12.510 に答える
4

これまで、公開された WebService API を扱うとき、私は常に日付バージョン管理の哲学に従っていました。残念ながら、「ベータ」モードを終了すると (場合によってはその後も)、公開する API の下位互換性に対処する必要があります。

私たちが行ったことは実にシンプルです。新しい API がリリースされた日に、次のようなフォルダー構造を作成します。

http://mydomain.com/path/to/service/2009/12/17/servicename.svc

そうすれば、フォルダー構造をチェックするだけでどのバージョンが最新であるかを知ることができ、クライアントはアップグレードの準備が整うまで変更を壊すことを心配する必要がなくなります. 私たちにとってチャンピオンのように働きました。私が変更した可能性がある唯一のことは、単一のフォルダーを使用して、それらをまとめて簡単に表示できるようにすることでした。

http://mydomain.com/path/to/service/2009-12-17/servicename.svc
于 2009-12-17T20:11:50.883 に答える
0

考えられる答えの 1 つは、置換グループを使用して、インポートする XSD で抽象モデルを有効にすることです。このような置換グループを処理する可能性は、これらのサービスを呼び出すために使用しているフレームワークで検証する必要があります。

于 2014-05-13T12:07:11.833 に答える