【问题标题】:What HTTP status code should a Web API return after successful completion, if it performed both UPDATES and INSERTS?如果 Web API 同时执行了 UPDATES 和 INSERTS,那么在成功完成后应该返回什么 HTTP 状态代码?
【发布时间】:2019-02-16 20:41:31
【问题描述】:

这是我之前在PUT or POST HTTP verb when calling API endpoint which performs both UPDATE and INSERT?发帖的后续问题

我有一个 RESTful Web API(用 ASP .Net Core 2.1 编写),它从消费客户端应用程序接收“更改日志”。这是一个 JSON 类,其中包含在客户端应用程序以离线模式工作时对数据库执行的所有修改。一旦客户端应用程序上线,它通过向 API 发送自上次同步以来发生的所有更改,将其数据库与在线/实时数据库同步。因此,它会向 API 发送一个变更集/变更日志,其中包含各种表/对象的 UPDATE、INSERT 和 DELETE 列表。

在 API 方面,我实际上并没有从实时数据库中删除任何内容 - 我只是将内容标记为已删除(因此我将布尔字段设置为 true,即 deleted = true)。所以从技术上讲,API 只对数据库执行 INSERTS 和 UPDATES

API的action方法在成功完成后应该返回什么状态码?由于它结合了 INSERTS 和 UPDATES,它应该返回 201 Created 吗?或者只是一个200 OK?或者如果只执行了更新,则为 200 OK,如果执行了任何插入,则为 201?另外,在响应正文中,由于我实际上并不打算返回正文中的任何 ID 或对象(因为会更新和插入多个对象),所以我只想返回纯文本,说明更新了多少对象,如何许多被插入,有多少被标记为已删除。这可能吗,甚至是个好主意?

谢谢

【问题讨论】:

    标签: rest httpresponse asp.net-core-webapi http-response-codes httpresponsemessage


    【解决方案1】:

    207来说似乎是个好情况,定义在RFC 4918中,是HTTP协议的扩展:

    11.1. 207 Multi-Status

    207(多状态)状态代码提供多个状态 独立运营。

    该文件还规定了以下内容:

    13. Multi-Status Response

    多状态响应传达有关多种资源的信息 在多个状态代码可能合适的情况下。 [...]

    虽然207用作整体响应状态码,但 收件人需要查阅多状态响应的内容 机构以获取有关成功或失败的更多信息 方法执行。响应可以成功使用,部分 成功和失败的情况。

    multistatus 根元素包含零个或多个 response 元素 以任何顺序,每个都包含有关单个资源的信息。 每个“响应”元素必须有一个href 元素来标识 资源。

    [...]

    【讨论】:

    • 谢谢卡西欧。是的,您的回复绝对有道理,我什至不知道有 207 回复。我选择了 Evert 的解决方案,因为它在这种情况下感觉是最正确的方法,但我会牢记你的。再次感谢!
    【解决方案2】:

    对我来说,这听起来不像 REST api。如果您通过一个端点一次更新和创建多个资源,这有点违反 REST 原则。

    鉴于这更像是一个类似 RPC 的调用,我将返回 200 OK 简单地表示操作成功。

    但是,有一种方法可以将其变成更像 REST 的东西。

    如果您有多个资源,这些资源中的基础数据可以组合并表示在一个资源中,一种“集合”资源。

    假设该资源托管在/clientstate/<client-id>。执行 GET 会返回整个 'clientstate' 资源。

    然后要更新此资源,您将使用PUT 替换整个客户端状态。对于客户来说,将多个数据库记录绑定到单个资源是完全不相关的。

    如果您使用PUT 替换整个客户端状态,则相应的响应代码仍应为200 OK。或者 204 No Content 如果你之后没有返回任何有趣的东西。

    我会 advise against 重新使用 207 Multi-Status

    【讨论】:

    • 谢谢 Evert,我真的很喜欢你解决这个问题的方法。是的,我同意你的观点,从同时执行 INSERTS 和 UPDATES 的角度来看,这个特定的端点可能不是 RESTful。但是从你的角度来看,我想它会是 RESTful 的,200 OK 或 204 NO CONTENT 回复将是完美的选择!
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2017-07-08
    • 2022-10-18
    • 2013-10-25
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多