Próbuję zaprojektować RESTful web API dla naszej usługi przy użyciu interfejsu ASP.NET Web API. Mam kłopot z ustaleniem, w jaki sposób przekierować działania inne niż CRUD do właściwego działania kontrolera. Załóżmy, że mój zasób to drzwi. Mogę zrobić wszystkie znane rzeczy z CRUD przy moich drzwiach. Powiedzmy, że wzorem dla moich drzwiach jest:Jak trasować akcje inne niż CRUD w RESTful ASP.NET Web API?
public class Door
{
public long Id { get; set; }
public string InsideRoomName { get; set; }
public string OutsideRoomName { get; set; }
}
mogę zrobić wszystko z moich standardowych operacji CRUD za pośrednictwem mojego Web API:
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
i tak dalej. Tam, gdzie napotykam na kłopoty, kiedy muszę wymodelować działania non-CRUD przeciwko moim drzwiom. Chcę modelować czasowniki blokujące i odblokowujące dla mojego zasobu. W przypadku czytania za pomocą instrukcji wydaje się, że podczas korzystania z działań niestandardowych przełącza się na wywołanie stylu RPC. To daje mi ścieżkę:
PUT: http://api.contoso.com/v1/doors/1234/lock
PUT: http://api.contoso.com/v1/doors/1234/unlock
Wydaje się to sprzeczne z duchem REST która ma na celu wskazać ścieżkę do zasobu. Przypuszczam, że mógłbym model czasownik jako zasób:
POST: http://api.contoso.com/v1/doors/1234/lockrequests
POST: http://api.contoso.com/v1/doors/1234/unlockrequests
w tym przypadku nadal może wykorzystać polecić {kontroler}/{id}/{akcja}, ale wydaje się, że nadal jestem tworząc mieszaną RPC/REST API. Czy jest możliwe, a nawet zalecane, jeśli chodzi o interfejsy REST, aby umieścić niestandardową akcję na liście parametrów?
PUT: http://api.contoso.com/v1/doors/1234?lock
PUT: http://api.contoso.com/v1/doors/1234?unlock
mogłem przewidzieć potrzebę posiadania tego połączenia obsługiwanego z parametrami zapytania, jak również, takich jak:
PUT: http://api.contoso.com/v1/doors?lock&InsideRoomName=Cafeteria
Jak utworzyć trasę na mapie Ten wniosek do mojego 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);
}
I może być wprowadzenie pewnych błędnych założeń dotyczących tego, co tu jest i nie jest najlepsze praktyki w odniesieniu do projektowania REST API, więc wszelkie wskazówki tam jest doceniana również.
Google korzysta z interfejsu REST API z Bloggerem, a korzysta z działań w trybie REST! https://developers.google.com/blogger/docs/3.0/reference/posts/publish – padibro