質問

したがって、私は Web サービスには少し慣れていないのですが、最近、クライアントに返されるデータ型に要素を追加する状況が発生しました。クライアントは、予期しない新しい要素で動作が停止したため、実装が壊れたと苦情を言いました。(Axis2経由でサービスを提供しています)。

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

基本的に、wsdl がインターフェースのように機能することを期待します。本質的にそのインターフェイスのサブタイプを変更する場合、クライアントは無関係な要素を喜んで無視することが期待されます。これは Web サービスの単なる欠点なのでしょうか、それとも、古いクライアントが好きなときに更新できる一方で、新しいクライアントが追加のデータを取得できるように、サービスに受動的に変更を加える賢明な方法はあるのでしょうか?

役に立ちましたか?

解決

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

WSDL がより具体的であればあるほど、より多くの動作が適切に実行されることが「保証」されます。

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

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

2 にはさらにリスクがありますが、XSD または他のテクノロジーで管理できます。特定のプロジェクト要件によって、何が許容されるかが決まります。

他のヒント

露出した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

WSDLは、効果的にWebサービスの公開されたSOAPインタフェースです。多くのクライアントが選択の彼らのプログラミング言語で、すべてのWebサービスメソッドを公開彼らのクライアントプロキシを生成するためにこれを使用しています。これらのコードが生成したクライアントのほとんどは非常に脆弱であり、彼らは、彼らが認識しない要素を参照してください場合は例外をスローすることを選択します(すなわち、そのないWSDL内)ではなく、それを無視します。いくつかは、よりリラックスしている、本当に彼らが使用するクライアント技術まで、すなわちMicrosoftの新しいのDataContract年代は、特に彼らはほとんど未知の要素を無視するように認識していないデータを保持するために、彼らのクライアントにIExtensibleDataインターフェイスを持っているされます。

彼らは、彼らが興味を持っている「スキーマ全体」だけではなく、ビットを理解したいクライアントを生成するため、

SOAPとコード生成されたクライアントプロキシは、問題のこれらの種類に適しています。それらは、XMLパーサーを使用するための代替でありますそしてちょうど彼らが必要とするビットを引き出します。

Webサービスを開発または定数の変化の下であれば、SOAPは、それが彼らのサービスのクライアントを、再生成再構築と再デプロイする必要がありますすべての変更を意味するとして本当にあなたの最良の選択ではありません。あなたの状況に応じて、あなたはそれがSOAPのオーバーヘッドを持っていないとして解析する代わりに、その単純としてREST + POX(プレーン旧XML)ウェブサービスを提供することを検討する必要があり、通常のURLを経由し、環境によって消費によって呼び出されることができます(AJAXを使用して、直接ブラウザで例えば)いるSOAPClientライブラリを持っていません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top