web-dev-qa-db-ja.com

JAX-RS REST API URIバージョン管理を処理する最良の方法

私は最初に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ベースのバージョニングに従っているときに使用するベストプラクティスを楽しみにしています

45
Deepesh M

URLに配置することの問題は、URLが場所によってリソースを表すことになっていることです。 APIバージョンは場所ではなく、リソースの識別子の一部でもありません。

URLに/v2/を付けると、以前に存在したすべての既存のリンクが壊れます。

APIのバージョン管理を指定する正しい方法が1つあります。

Accept:ヘッダーのmime-typeに入れてください。 Accept: application/myapp.2.0.1+jsonのようなもの

Chain of Responsiblity パターンは、特に持つ必要があるほど十分に異なるAPIバージョンが多数存在する場合、ここでうまくいきます独自のハンドラーを使用すると、メソッドが手に負えなくなります。

16
user177800

このブログ投稿には、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"})
11
David Dossot

と呼ばれるProductServiceのサブクラスがないのだろうと思いました

@Path(/v2/ProductService)
ProductServiceV2 extends ProductService {


}


@Path(/v1/ProductService)
 class ProductService{


}

v2で変更されたもののみをオーバーライドします。変更されていないものはすべて、v1/ProductServiceと同じように機能します。

これは間違いなくクラスの数を増やすことになりますが、新しいバージョンのapiで変更されているものだけをコーディングし、コードを複製せずに古いバージョンに戻す簡単な方法の1つです。

2
Chetya