3

私はWeb.Apiでのルーティングと、エンドポイントを表すさまざまな方法を検討してきました。InstagramのRESTエンドポイントに出くわしました。(いくつかの素敵なドキュメントがあります)Web.Apiを使用して、Instagramユーザーエンドポイントのような状況のルーティングとコントローラーを設定するための最良の方法は何でしょうか?

User Endpoints
GET/users/user-id                  Get basic information about a user.
GET/users/self/feed                See the authenticated user's feed.
GET/users/user-id/media/recent     Get the most recent media published by a user.
GET/users/self/media/liked         See the authenticated user's list of liked media.
GET/users/search                   Search for a user by name.

これらのエンドポイントをアプリで複製したい場合は、どうすればよいでしょうか。5つのメソッドを持つ1つのコントローラー「ユーザー」が必要でしょうか。REST呼び出しをそれらのメソッドに転送するには、どのようなルーティングが必要ですか。

4

1 に答える 1

5

これを別の方法で構成します。

GET/user
GET/user/user-id
GET/user?q=user-name

GET/media
GET/media/user-id
GET/media/user-id?selection=recent
GET/media/user-id?selection=liked

GET/feed
GET/feed/user-id

このようにして、単一の責任のためにクラスを維持するのと同じように、特定のターゲットに対してコントローラーを維持します。

  • ユーザー
  • メディア

このアプローチを使用すると、ユーザーがパスを「推測」するのがはるかに簡単になります。そして、説明なしで各パスが何をするかはすでに推測できると思います。私にとって、これはAPIを設計するときに最も重要です。

GET/controller            - always returns a item list
GET/controller/id         - always returns a specific item
GET/controller?q=         - always queries the controller
GET/controller?selection= - always selects a subset from the list off items

もちろん、これは解釈の余地がありますが、私がこの特定の問題をどのように解決するかについてのアイデアと、おそらく考えるべきいくつかのアイデアを提供します。この素晴らしい本もご覧くださいApigee - Web Api Designs

http://info.apigee.com/Portals/62317/docs/web%20api.pdf

編集:

名前を付けたルートを作成するには、2つの(あまり理想的ではない)オプションがあると思います。

  1. 各URLの特定のルートをマップします
  2. ワイルドカードルートを作成する

オプション1 私はこれを試したことがないか、自分で使用していませんが、詳細についてはこちらをご覧ください。

ASP.NETWebAPIの複数のGETメソッドを備えた単一のコントローラー

オプション2 ワイルドカードルートを使用すると、追加のパラメーターを持つすべてのリクエストがデフォルトのGet()メソッドにルーティングされます。getでは、またはそれに類似したものを使用してパラメーターを確認し、ControllerContext.Request.RequestUri.AbsolutePathそれに対するアクションを選択する必要があります。

config.Routes.MapHttpRoute(
     name: "MyApi",
     routeTemplate: "api/{controller}/{id}/{*wildcard}",
     defaults: new { controller = "index", id = RouteParameter.Optional }
 );
于 2012-10-24T00:24:34.547 に答える