2012-05-14 10 views
5

私は安らかなAPIのバージョン管理について多くのことを読んでいると思いますが、私はuriを通してサービスをバージョンアップしないことにしました。WCFまたはASP.Net Web APIを使用したRESTful APIのバージョニングの実装

uri、書式(例:application/json)、およびスキーマ/形式の要求されたリソースを定義する要求を処理するwcfサービスまたはWeb APIサービスを実装する最良の方法は何でしょうか。バージョン(例:player-v2)を受け入れる?

WCFを使用すると、URIに基づいてルーティングすることができますが、ヘッダーに基づいてルーティングすることはできません。だから私は適切に経路を設定することはできません。

Web Apiでは、要求されたフォーマットではなく、スキーマではないカスタムMediatypeformattersを定義することができます(たとえば、戻り値の型はPlayerV1またはPlayerV2)。

Iは、サービスを実装したい

(いずれかWCFまたはWeb APIを使用して)この要求のために、(擬似コード):

api.myservice.com/players/123 Accept format=application/json; schema=player-v1 

は、JSON形式で、PlayerV1エンティティを返し

とするため

この要求:

api.myservice.com/players/123 Accept format=application/json; schema=player-v2 

は、json形式でPlayerV2エンティティを返します。

これを実装する方法に関するヒントを教えてください。

EDIT:バージョンを処理するためにコンテンツネゴシエーションを使用する理由を明確にするには、REST API Design: Put the “Type” in “Content-Type”を参照してください。

答えて

2

あなたがここに持っているものは、バージョン管理として私には見えませんが、それはコンテンツ交渉のほうです。 Acceptヘッダーは、クライアントの希望をリソースの形式で表現します。サーバーは望みを与えなければならないか、返す必要があります。したがって、Contractのコンセプトがもっと必要な場合(Web APIのunline RPCでは定義されていませんが)、リソースを使用するとより確かです。

バージョン管理のためのベストプラクティスを十分に検討するためには至っていないが、最もREST愛好家は、URLにバージョンを使用して(例えばhttp://server/api/1.0.3/...)進むべき道であると信じています。これはまた、コンテンツネゴシエーションサーバーを使用するアプローチでは下位互換性を維持する必要があるため、サーバー上のコードがますます複雑になると想像することができるので、私にとってはより意味があります。 URLアプローチを使用すれば、新しいクライアントが新しいAPIのメリットを享受できるようになる一方で、古いクライアントは以前のクライアントを喜んで利用できるようになります。


UPDATE

OK、今の質問は、 "RESTfulなAPのコンテンツ・ネゴシエーションを実装" に変更されました。

タイプ1:コンテントネゴシエーションを実装するか、右のメディアタイプのフォーマッタを使用して、リソースの形式のみを伴う場合コントローラー-忘れ

基本的には、十分です。たとえば、コンテンツネゴシエーションでJSONまたはXMLを返す必要がある場合。このような場合、コントローラはコンテンツのネゴシエーションにはを無視します。

タイプ2:コントローラを意識し

コントローラが要求交渉を意識する必要があります。この場合、リクエストからのパラメータをリクエストから抽出し、パラメータとして渡す必要があります。たとえば、のは、コントローラ上でこのアクションを想像してみましょう:

public Player Get(string schemaVersion) 
{ 
    ... 
} 

この場合、私は(参照Brad Wilson's post on ValueProviders - これはMVCであるが、ウェブAPIの値プロバイダが似ています)古典的なMVCスタイルの値プロバイダを使用します。

public Player Get([ValueProvider(typeof(RequestHeadersSchemaValueProviderFactory))]string schemaVersion) 
{ 
    ... 
} 
+2

ここでのポイントではないので、どの方法が良いかについての議論を開始しません(URIのバージョンかどうか)。私は、「RESTful APIでコンテンツネゴシエーションを実装する」という言い方を変えることができます。実装上の課題は同じではないでしょうか? – codeclash

+0

@ cardinal私は更新しました。 – Aliostad

+0

値の提供者は私に要求されたスキームへのアクセスを許可しますが、いずれの場合でも、あなたの例の戻り値の型はPlayerですが、実際には、要求されたスキームに応じてPlayerまたはPlayerV2を返す必要があります。何か不足していますか?その場合、 – codeclash