Rest 如果Web API同时执行更新和插入,则在成功完成后应返回什么HTTP状态代码?
这是我在上一篇文章的后续问题 我有一个RESTfulWebAPI(用ASP.NETCore2.1编写),它从消费客户端应用程序接收“更改日志”。这是一个JSON类,包含在客户端应用程序脱机工作时对数据库执行的所有修改。一旦客户端应用程序联机,它将通过向API发送自上次同步以来发生的所有更改,将其数据库与联机/实时数据库同步。因此,它向API发送一个变更集/变更日志,其中包含一系列针对各种表/对象的更新、插入和删除列表 在API方面,我实际上并没有从live数据库中删除任何内容——我只是将内容标记为已删除(因此我将布尔字段设置为true,即deleted=true)。因此,从技术上讲,API只对数据库执行插入和更新 成功完成后,API的操作方法应返回什么状态代码?既然它同时执行插入和更新,那么它是否应该返回一个已创建的文件?或者干脆200美元就行了?如果只执行了更新,则为200 OK,如果执行了任何插入,则为201?另外,在响应主体中,由于我实际上不打算返回主体中的任何ID或对象(因为多个对象将被更新和插入),我只想返回纯文本,说明有多少对象被更新,有多少被插入,有多少被标记为删除。这是可能的,还是一个好主意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数据库中删除任何内容——我只是将内容标记
感谢这似乎是一个很好的情况,在中定义了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