什么会更RESTful:在WebAPI中通过PATCH翻转布尔值的推荐做法

时间:2013-03-08 05:26:06

标签: asp.net-mvc web-applications asp.net-mvc-4 asp.net-web-api

我正在构建我的第一个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,因此后者似乎更昂贵。什么是最好的,为什么?

1 个答案:

答案 0 :(得分:2)

什么是RESTful基本上是问题。

如果您想要非常有趣的解释,我强烈建议您查看这篇史诗和着名的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服务的全部内容。