我试图设计使用的ASP.NET Web API我们的服务REST风格的Web API。 我遇到麻烦,首先要弄清楚非CRUD如何路由行动,以适当的控制器动作。 假设我的资源是一扇门。 我可以做所有的熟悉CRUD的东西与我的门。 假设模型我的门是:
public class Door
{
public long Id { get; set; }
public string InsideRoomName { get; set; }
public string OutsideRoomName { get; set; }
}
我可以通过我的网络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文章的指导似乎是使用自定义操作时切换到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设计不是最佳做法,所以任何指导有赞赏也。