Rest 如果Web API同时执行更新和插入,则在成功完成后应返回什么HTTP状态代码?

Rest 如果Web API同时执行更新和插入,则在成功完成后应返回什么HTTP状态代码?,rest,httpresponse,asp.net-core-webapi,http-response-codes,httpresponsemessage,Rest,Httpresponse,Asp.net Core Webapi,Http Response Codes,Httpresponsemessage,这是我在上一篇文章的后续问题 我有一个RESTfulWebAPI(用ASP.NETCore2.1编写),它从消费客户端应用程序接收“更改日志”。这是一个JSON类,包含在客户端应用程序脱机工作时对数据库执行的所有修改。一旦客户端应用程序联机,它将通过向API发送自上次同步以来发生的所有更改,将其数据库与联机/实时数据库同步。因此,它向API发送一个变更集/变更日志,其中包含一系列针对各种表/对象的更新、插入和删除列表 在API方面,我实际上并没有从live数据库中删除任何内容——我只是将内容标记

这是我在上一篇文章的后续问题

我有一个RESTfulWebAPI(用ASP.NETCore2.1编写),它从消费客户端应用程序接收“更改日志”。这是一个JSON类,包含在客户端应用程序脱机工作时对数据库执行的所有修改。一旦客户端应用程序联机,它将通过向API发送自上次同步以来发生的所有更改,将其数据库与联机/实时数据库同步。因此,它向API发送一个变更集/变更日志,其中包含一系列针对各种表/对象的更新、插入和删除列表

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

成功完成后,API的操作方法应返回什么状态代码?既然它同时执行插入和更新,那么它是否应该返回一个已创建的文件?或者干脆200美元就行了?如果只执行了更新,则为200 OK,如果执行了任何插入,则为201?另外,在响应主体中,由于我实际上不打算返回主体中的任何ID或对象(因为多个对象将被更新和插入),我只想返回纯文本,说明有多少对象被更新,有多少被插入,有多少被标记为删除。这是可能的,还是一个好主意


感谢

这似乎是一个很好的情况,在中定义了HTTP协议的扩展:

207
(多状态)状态代码为多个状态提供状态 独立运作

该文件还规定:

多状态响应传递有关多个资源的信息 在多个状态代码可能适用的情况下。[……]

虽然
207
用作总体响应状态代码,但 接收者需要查阅multistatus响应的内容 获取有关项目成功或失败的更多信息的机构 方法执行。该响应可用于成功、部分 在成功和失败的情况下

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

[……]


这似乎是HTTP协议扩展的一个好情况,定义如下:

207
(多状态)状态代码为多个状态提供状态 独立运作

该文件还规定:

多状态响应传递有关多个资源的信息 在多个状态代码可能适用的情况下。[……]

虽然
207
用作总体响应状态代码,但 接收者需要查阅multistatus响应的内容 获取有关项目成功或失败的更多信息的机构 方法执行。该响应可用于成功、部分 在成功和失败的情况下

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

[……]


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

考虑到这更像是一个RPC调用,我将返回
200ok
,只是指示操作成功

然而,有一种方法可以把它变成更像REST的东西

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

假设该资源托管在
/clientstate/
。执行
GET
返回整个“clientstate”资源

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

如果使用
PUT
替换整个客户端状态,则相应的响应代码仍应为
200 OK
。或者,如果您事后没有返回任何有趣的内容,则可能
204无内容


我打算使用
207多状态

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

考虑到这更像是一个RPC调用,我将返回
200ok
,只是指示操作成功

然而,有一种方法可以把它变成更像REST的东西

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

假设该资源托管在
/clientstate/
。执行
GET
返回整个“clientstate”资源

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

如果使用
PUT
替换整个客户端状态,则相应的响应代码仍应为
200 OK