asp.net-mvc - 还有什么更 RESTful : Recommended practice for flipping a boolean via PATCH in WebAPI

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

我正在构建我的第一个 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/

相关文章:

c# - 在 asp.net mvc 4 中获取登录用户的 ID

c# - 作为查询字符串附加的属性

php - 什么使 CakePHP 安全,我们如何提高它的安全性?

java -/WEB-INF/类与/WEB-INF/lib

email - 是否有用于测试 "throwaway"电子邮件的标准域?

jquery - 如何在 javascript/jquery 中获取表单提交事件的响应?

asp.net mvc 重定向到操作而不触发当前 View 中的验证?

javascript - jQuery 移动 : How to go back one page?

c# - 在不同的 Controller 操作方法之间传递数据

c# - 可以从 firefox 和 chrome 下载文件,但不能在 IE 中下载文件