成功完成后,Web API应返回什么HTTP状态代码,如果它同时执行UPDATES和INSERTS?

问题描述 投票:0回答:2

这是我在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
2个回答
1
投票

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

鉴于这更像是一个类似RPC的调用,我会返回200 OK,只是表明操作成功。

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

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

让我们说这个资源是在/clientstate/<client-id>上托管的。做一个GET会返回整个'clientstate'资源。

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

如果您使用PUT替换整个客户端状态,那么相应的响应代码应该仍然是200 OK。或者也许204 No Content如果你之后没有回复任何有趣的东西。

advise against重新使用207 Multi-Status


1
投票

207似乎是一个很好的情况,RFC 4918是HTTP协议的扩展:

11.1. 207 Multi-Status

207(多状态)状态代码提供多个独立操作的状态。

该文件还说明如下:

13. Multi-Status Response

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

虽然207用作整体响应状态代码,但是接收方需要查询多状态响应正文的内容,以获取有关方法执行成功或失败的更多信息。响应可以用于成功,部分成功以及失败情况。

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

[...]

© www.soinside.com 2019 - 2024. All rights reserved.