用于附加到资源对象的 HTTP 动词?

HTTP verb for appending to a resource object?

我正在尝试构建一个符合 json:api 规范的 api。

我的 api 有三个资源 /task/item/result。任务具有字段 namedescriptionstate。项目具有字段 itemNamecount 保留在服务器站点上,当用户使用 GET 请求检索该项目时,将返回 countcount 在项目更新时在服务器端递增。任务和项目之间存在一对多的关系。从某种意义上说,一个项目附加到一个任务。当任务状态发生变化时,脚本会在服务器端运行以对关联的项目进行一些处理。脚本完成后,结果资源中的输出可用。

根据规范,我使用 POST 动词创建任务,使用 PATCH 更新任务。我只想要一个端点来处理项目的创建/更新(附加)。但是,我不确定该使用哪个动词?我可以使用 PATCH 来更新项目,如果项目不存在也可以创建项目吗?

我还认为也许我应该使用 PUT 动词。但是,我在这里的理解是,这个动词用于简单地替换资源而不是更新它。我认为这不适合我的用户案例,因为更新时项目计数会增加,因此替换它不是我想要做的。但是,计数是在服务器端处理的,因此用户无论如何都无法选择“替换”计数。

my understanding here is that this verb is used to simply replace a resource rather than update it.

这是一个普遍的理解 - 错误,但很普遍。

IANA 注册表记录了 http methods. Most of the common ones are defined by RFC 7231; PATCH is defined by RFC 5789 语义的权威参考。

PUT 当消息 body 是您想要的资源的完整表示时,是一个合适的选择。考虑“保存文件”可能更容易; PUT 描述了客户希望文档在保存后的样子。

只要客户端知道文档的标识符,就可以使用 PUT 来更新文档或创建文档(就像我们可以使用保存来创建文件或替换文件一样,但我们需要知道文件名)。

如果您阅读规范的文本,您会看到 - 虽然请求的语义是保存新表示“as-is”,但服务器不需要这样做 - - 毕竟,服务器控制着自己的文档——所以有空间来覆盖只读字段,或者只应由服务器更新的字段。您需要稍微注意一下响应 headers,以避免暗示您按原样保存了表示,但除此之外您应该没问题。