私はASP.NET Web APIを使用して、私たちのサービス用にRESTful Web APIを設計しようとしています。私は、CRUD以外のアクションを適切なコントローラーアクションにルーティングする方法を理解することに苦労しています。私のリソースがドアだとしましょう。私は慣れ親しんだCRUDのことをすべて私のドアで行うことができます。RESTfulなASP.NET Web APIで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アクションをモデル化する必要があるときです。私は自分のリソースに対してロックとアンロックの動詞をモデル化したいと思う。 ASP.NET articlesを読むと、カスタムアクションを使用するときにRPCスタイルの呼び出しに切り替えるように見えます。これは私にパスを与えます:
これは、リソースを示すための経路を目指すRESTの精神と矛盾するようです。私はリソースとして動詞をモデル化することができたとします
POST: http://api.contoso.com/v1/doors/1234/lockrequests
POST: http://api.contoso.com/v1/doors/1234/unlockrequests
この場合、私はまだお勧めします{コントローラ}を使用することができます/ {ID}/{アクション}が、私はまだ混在RPCを作成してるように思えます/ REST API。カスタムアクションをパラメータのリストに入れることは可能ですか、それともRESTインターフェースまで推奨されますか?
PUT: http://api.contoso.com/v1/doors/1234?lock
PUT: http://api.contoso.com/v1/doors/1234?unlock
私は、次のような、この呼び出しは、同様にクエリパラメータをサポート持つ必要性を予見できますどのように私は私のDoorsControllerにこの要求をマッピングするためにルートを作成します
PUT: http://api.contoso.com/v1/doors?lock&InsideRoomName=Cafeteria
?
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の設計に関するベストプラクティスではないので、任意のガイダンスは、そこにも高く評価されていてもよいです。
国が利用可能な値の列挙ですpublic State State { get; set; }
を、例えば:あなたはDoor
オブジェクトへState
プロパティを追加することを検討できlock/unlock
シナリオを処理するために
GoogleではBloggerでREST APIを使用しています.RESTのアクションを使用しています。 https://developers.google.com/blogger/docs/3.0/reference/posts/publish – padibro