这是我在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 API。如果您通过一个端点一次更新和创建多个资源,则会违反REST原则。
鉴于这更像是一个类似RPC的调用,我会返回200 OK
,只是表明操作成功。
但是,有一种方法可以将其变成更像REST的东西。
如果您有多个资源,那么这些资源中的基础数据可以合并在一个资源中,即一种“集合”资源。
让我们说这个资源是在/clientstate/<client-id>
上托管的。做一个GET
会返回整个'clientstate'资源。
然后,要更新此资源,您将使用PUT
替换整个客户端状态。对于客户来说,与单个资源绑定的多个数据库记录完全无关紧要。
如果您使用PUT
替换整个客户端状态,那么相应的响应代码应该仍然是200 OK
。或者也许204 No Content
如果你之后没有回复任何有趣的东西。
我advise against重新使用207 Multi-Status
。