Я пытаюсь создать веб-API RESTful для нашей службы с помощью ASP.NET Web API. У меня возникают проблемы с выяснением того, как направлять действия, отличные от CRUD, на правильное действие контроллера. Пусть мой ресурс - это дверь. Я могу сделать все знакомые вещи CRUD с моей дверью. Скажем, эта модель для моей двери:
public class Door
{
public long Id { get; set; }
public string InsideRoomName { get; set; }
public string OutsideRoomName { get; set; }
}
Я могу выполнять все стандартные операции CRUD через мой веб-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
и т.д. Там, где я столкнулся с трудностями, мне нужно смоделировать действия, не связанные с CRUD, против моей двери. Я хочу смоделировать глагол Lock and 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}, но похоже, что я все еще создаю смешанный API RPC/REST. Возможно ли, или даже рекомендовано, насколько подходят интерфейсы 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, поэтому любое руководство там также оценено.