2

我正在构建我的第一个 API,我想知道这里最好的方法是什么。我有一个带有布尔字段“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 /api/objects/1

然后在正文中发送一些数据,例如

{isArchived: true}

似乎后者更昂贵,因为我们发送数据而不仅仅是一个 id。什么是最好的,为什么?

4

1 回答 1

2

什么是 RESTful 基本上是这里的问题。

如果您想要真正有趣的解释,我强烈建议您查看这篇史诗般的著名 REST“文章”:我如何向我的妻子解释 REST

所以支持你的具体问题。本着 REST 的精神,您应该创建一个适当的“资源”。在您的情况下,这意味着“归档对象”资源。你只需对它应用 HTTP 动词。这本质上是一个 RESTful 服务。

如果您尝试为操作命名,那么您可能走错了路。

那么该怎么办?创建“归档对象”WebAPI 控制器,然后,我想,取决于天气函数是幂等用户正确的 HTTP 动词。POST 用于创建,PUT 用于更新场景(幂等函数)。不要忘记在 POST(创建)场景中返回新的资源 URI。但据我所见,您可以从您的代码中看到 PUT 场景。因为您可以(我想)多次归档对象。

如何将附加数据(在您的情况下{isArchived: true})发送到 API?简单,只需将这些数据放入请求的正文中即可。这就是为什么我们在 HTTP 请求中有正文消息的原因。

因此,您的 PUT URI 应如下所示:

PUT /api/objects/achive/1

这意味着您拥有对象控制器以及“归档控制器”。很棒不是吗?如果你做正确的 REST,API 真的很漂亮并且易于理解和使用。这都是关于 RESTful 服务的。

于 2013-03-08T06:20:07.670 回答