web-dev-qa-db-ja.com

トリッキーなREST APIをASP.NET Web APIで実装する

ゲーム用にASP.NET Web APIを使用してRESTful APIを構築しようとしていますが、これまでに持っていたメソッドは次のとおりです。

/games GET
/games/:id GET
/games POST
/games PUT
/games DELETE
/users GET
/users/:id GET
/users/:id/games GET  (fetch user's games)
/users POST
/users PUT
/users DELETE

2つの質問があります。

  1. / users /:id/gamesメソッドはどこに配置しますか? 2つのコントローラー(GamesController.csとUsersController.cs)があります。私が要求しているリソースはゲームなので、GamesControllerに移動してユーザーIDをパラメーターとして渡し、/ users /:id/gameルートにマッピングするだけですか?

  2. 私はたくさんのゲームを返すメソッド(/ games GET)を持っていますが、実際には少なくとも最初はそれを使用していません。代わりに、ユーザーに一度に1つのゲームのみを表示します。このゲームは、多くのアクティビティがあり、ユーザーがいくつかのアクションを実行できる「人気のある/ホット」なゲームになります(ユーザーがアクションを実行できず、対戦相手からのアクションを待つ必要があります)。ユーザーが「次へ」をクリックしたときにユーザーに表示するゲームを決定するGetHotGame()と呼ばれるメソッドがありますが、RESTメソッドは?

/ games /:idエンドポイントを使用して、IDとして「hot」を渡し、GetHotGameメソッドを使用してユーザーに返すゲームを決定できますか?または、/ gamesエンドポイントを使用して、クエリ文字列として「hot」を渡し、ページ数が1つだけの一種のページングを実装する必要がありますか?または、games/hotや/ hotgameのような別のエンドポイントを完全に用意する必要がありますか?

3
Prabhu

まず、検討する代替案...

長年のWebサービスの設計と実装(およびいくつかの標準以下の実装も継承)を経て、他の一部にも同様の結論が出ました。

Matthew Bealeの 推奨REST APIプラクティス 記事は、この背後にある理由を説明しています。(ファーストクラスモデルセクション。)

しかし、あなたが主張した場合...

  1. ネストされたリソースパスを使用する必要がある(または使用したい)場合は、どのタイプのリソースが返されるかに基づいてメソッドをグループ化することをお勧めします。そう /users/:id/gamesGamesControllerに実装されます。ここでの私の推論は、APIクラスとDALクラスの間のより一貫した相関を維持することです。これにより、後で当て推量を回避し、クラス間の依存関係の数を減らすことができます。

  2. あなたのクエリ文字列の提案は、基本的に#1と同じ理由で最もクリーンだと思います(ゲームを返すので、/gamesリソース、およびGamesController)に実装されています。何かのようなもの /games?keyword=hot&limit=1は、他の場所で使用されている、私が見た成功した直感的なAPIアプローチのパターンに似ています。

4
Troy Gizzi