私は最初にstackoverflowで検索しましたが、質問に関連する答えを見つけることができませんでした。私が見つけられるのは、REST uri design。
バックエンド側の私の質問。 REST uri'sの2つの異なるバージョンがあるとします
http://api.abc.com/rest/v1/products
http://api.abc.com/rest/v2/products
バージョンに基づいたこれら2つのapiのセット全体で既存のクラスを適切にルーティング、管理、再利用するために、バックエンド側(サーバー側コード)で従う最良のアプローチは何ですか?
たとえば、異なる@Pathアノテーションを使用してリソースクラスを定義するアプローチを考えました。 v1とv2のパッケージを個別に用意し、そのパッケージのProductsResourceクラスに定義します
package com.abc.api.rest.v1.products;
@Path("/rest/v1/products")
public class ProductsResource {...}
package com.abc.api.rest.v2.products;
@Path("/rest/v2/products")
public class ProductsResource {...}
そして、バージョンに基づいて実装ロジックを作成します。このアプローチの問題は、特定のリソースAPIをAPIのセットから1つだけ変更する場合、他のクラスもv2パッケージにコピーする必要があることです。それを回避できますか?
@Versionと言うカスタムアノテーションを作成して、サポートするバージョンの値を設定する方法はありますか?これで、v1であろうとv2であろうと、両方の要求は同じリソースクラスに送られます。
たとえば.
package com.abc.api.rest.products;
@Path("/rest/{version: [0-9]+}/products")
@Version(1,2)
public class ProductsResource {...}
UPDATE:
ヘッダー内のバージョンを処理するためのJarrodによるAPIバージョン管理の提案がありました。それはそれを行う1つの方法でもありますが、URIベースのバージョニングに従っているときに使用するベストプラクティスを楽しみにしています
URLに配置することの問題は、URLが場所によってリソースを表すことになっていることです。 APIバージョンは場所ではなく、リソースの識別子の一部でもありません。
URLに/v2/
を付けると、以前に存在したすべての既存のリンクが壊れます。
APIのバージョン管理を指定する正しい方法が1つあります。
Accept:
ヘッダーのmime-typeに入れてください。 Accept: application/myapp.2.0.1+json
のようなもの
Chain of Responsiblity パターンは、特に持つ必要があるほど十分に異なるAPIバージョンが多数存在する場合、ここでうまくいきます独自のハンドラーを使用すると、メソッドが手に負えなくなります。
このブログ投稿には、URIにバージョンがないという、正しいアプローチであると考えられるものの例があります。 http://codebias.blogspot.ca/2014/03/versioning-rest- apis-with-custom-accept.html
つまり、JAX-RSを活用します@Consume
特定のバージョンのリクエストを特定の実装に関連付けるための注釈:
@Consumes({"application/vnd.blog.v1+xml", "application/vnd.blog.v1+json"})
と呼ばれるProductServiceのサブクラスがないのだろうと思いました
@Path(/v2/ProductService)
ProductServiceV2 extends ProductService {
}
@Path(/v1/ProductService)
class ProductService{
}
v2で変更されたもののみをオーバーライドします。変更されていないものはすべて、v1/ProductServiceと同じように機能します。
これは間違いなくクラスの数を増やすことになりますが、新しいバージョンのapiで変更されているものだけをコーディングし、コードを複製せずに古いバージョンに戻す簡単な方法の1つです。