我正在构建我的第一个API,我想知道这里最好的方法是什么。我有一个布尔fiels“isArchived”的对象。当用户点击对象上的“存档”时,我想翻转这个布尔值。我的问题:我可以打电话给:
PUT /api/objects/archive/1
会用这样的逻辑击中控制器:
[ActionName("archive")]
public HttpResponseMessage ArchiveObject(int id)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
_service.ArchiveObject(id);
return Request.CreateResponse(HttpStatusCode.OK);
}
或通过这样的方式对PATCH更好:
PATCH /api/objects/1
然后在正文中发送一些数据,如
{isArchived: true}
由于我们发送数据而不仅仅是id,因此后者似乎更昂贵。什么是最好的,为什么?
答案 0 :(得分:2)
如果您想要非常有趣的解释,我强烈建议您查看这篇史诗和着名的REST“文章”:How I Explained REST to My Wife
所以回答你的具体问题。根据REST的精神,您应该创建一个合适的“资源”。在您的情况下,这意味着“归档对象”资源。你只需对它应用HTTP动词。这本质上是一个RESTful服务。
如果你试图给某个动作起一个名字,那么你可能走错了路。
那该怎么办?创建“归档对象”WebAPI控制器然后,我认为,依赖天气函数是幂等用户正确的HTTP动词。 POST for create,PUT for update scenario(幂等函数)。不要忘记在POST(创建)场景中返回新的资源URI。但就我所见,您可以看到您的代码,您可以使用PUT方案。因为你能够(我推测)多次存档对象。
如何将附加数据(在您的情况下为{isArchived: true}
)发送到API? Simpy,只需将这些数据放入请求正文中即可。这就是为什么我们在HTTP请求中有正文消息。
因此,您的PUT URI应如下所示:
PUT /api/objects/achive/1
这意味着您拥有对象控制器以及“归档控制器”。好不是吗?如果你做了正确的REST,API非常漂亮,易于理解和使用。这就是RESTful服务的全部内容。