ASP.NET Web API を使用して、サービス用の RESTful Web API を設計しようとしています。非 CRUD アクションを適切なコントローラー アクションにルーティングする方法を理解するのに苦労しています。私のリソースがドアだとしましょう。使い慣れた CRUD のすべてを自分のドアで実行できます。私のドアのモデルは次のとおりです。
public class Door
{
public long Id { get; set; }
public string InsideRoomName { get; set; }
public string OutsideRoomName { get; set; }
}
Web API を介して、すべての標準 CRUD 操作を実行できます。
POST: http://api.contoso.com/v1/doors
GET: http://api.contoso.com/v1/doors
GET: http://api.contoso.com/v1/doors/1234
GET: http://api.contoso.com/v1/doors?InsideRoomName=Cafeteria
PUT: http://api.contoso.com/v1/doors/1234
DELETE: http://api.contoso.com/v1/doors/1234
等々。私が問題に遭遇するのは、ドアに対する非 CRUD アクションをモデル化する必要があるときです。自分のリソースに対して Lock および Unlock 動詞をモデル化したいと考えています。ASP.NETの記事を読むと、カスタム アクションを使用する場合は RPC スタイルの呼び出しに切り替えるように指示されているようです。これは私にパスを与えます:
PUT: http://api.contoso.com/v1/doors/1234/lock
PUT: http://api.contoso.com/v1/doors/1234/unlock
これは、パスがリソースを示すことを目指す REST の精神と相反するようです。動詞をリソースとしてモデル化できると思います。
POST: http://api.contoso.com/v1/doors/1234/lockrequests
POST: http://api.contoso.com/v1/doors/1234/unlockrequests
この場合、推奨される {controller}/{id}/{action} を引き続き使用できますが、混合 RPC / REST API をまだ作成しているようです。パラメータのリストにカスタムアクションを入れることは可能ですか、またはRESTインターフェースに関する限り推奨されていますか?
PUT: http://api.contoso.com/v1/doors/1234?lock
PUT: http://api.contoso.com/v1/doors/1234?unlock
この呼び出しを、次のようなクエリ パラメータでもサポートする必要があると予測できました。
PUT: http://api.contoso.com/v1/doors?lock&InsideRoomName=Cafeteria
このリクエストを DoorsController にマップするルートを作成するにはどうすればよいですか?
public class DoorsController : ApiController
{
public IEnumerable<Doord> Get();
public Door Get(long id);
public void Put(long id, Door door);
public void Post(Door door);
public void Delete(long id);
public void Lock(long id);
public void Unlock(long id);
public void Lock(string InsideRoomName);
}
ここでは、REST API 設計に関するベスト プラクティスとそうでないものに関して、いくつかの誤った仮定を行っている可能性があるため、そこにあるガイダンスも高く評価されます。