我想为使用ASP.NET Web API的服务设计一个REST风格的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; }
}
我可以做所有我的标准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操作时。我想对我的资源建模一个锁定和解锁动词。通过ASP.NET articles阅读指南似乎是使用自定义操作时切换到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
在这种情况下,我仍然可以使用建议{控制器}/{ID}/{行动},但它好像我还是创建一个混合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设计的最佳实践,因此任何指导,有赞赏也。
谷歌使用REST API与Blogger,蚂蚁在它使用REST行动! https://developers.google.com/blogger/docs/3.0/reference/posts/publish – padibro