我正在构建我的第一个 API,我想知道这里最好的方法是什么。我有一个带有 bool 字段“isArchived”的对象。当用户单击对象上的“存档”时,我想翻转这个 bool 值。我的问题:我可以这样称呼:
PUT /api/objects/archive/1
它将用如下逻辑命中 Controller :
[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 /api/objects/1
然后在正文中发送一些数据,例如
{isArchived: true}
似乎后者更昂贵,因为我们发送数据而不仅仅是 ID。什么是最好的,为什么?
最佳答案
什么是 RESTful 基本上是这里的问题。
如果您想要真正深入有趣的解释,我强烈建议您查看这篇史诗般且著名的 REST“文章”:How I Explained REST to My Wife
那么请回答你的具体问题。本着 REST 的精神,您应该创建适当的“资源”。在您的情况下,这意味着“归档对象”资源。您只需对其应用 HTTP 动词即可。这本质上是一种 RESTful 服务。
如果您尝试为某个操作命名,那么您可能走错了路。
那么该怎么办呢?创建“归档对象”WebAPI Controller ,然后,我认为,取决于该函数是否幂等,用户是否使用正确的 HTTP 动词。 POST 用于创建,PUT 用于更新场景(幂等函数)。不要忘记在 POST(创建)场景中返回新资源 URI。但据我从您的代码中可以看出,您已经达到了 PUT 场景。因为您能够(我认为)多次归档对象。
如何向 API 发送附加数据(在您的情况下为 {isArchived: true}
)?很简单,只需将这些数据放入请求正文中即可。这就是为什么我们在 HTTP 请求中包含正文消息。
因此,您的 PUT URI 应如下所示:
PUT /api/objects/achive/1
这意味着您拥有对象 Controller 和“存档 Controller ”。很棒不是吗?如果您执行正确的 REST,API 就会非常漂亮且易于理解和使用。这就是 RESTful 服务的全部内容。
关于asp.net-mvc - 还有什么更 RESTful : Recommended practice for flipping a boolean via PATCH in WebAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287313/