使PUT在REST API中创建请求幂等

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

我的目标是创建idempotent / create REST API,它实现为PUT动词。

Idempotent RFC 说:

幂等方法是有区别的,因为请求可以是 如果在通信失败之前发生,则自动重复 客户端能够读取服务器的响应。例如,如果是 客户端发送PUT请求,底层连接关闭 在收到任何响应之前,客户端可以建立新的响应 连接并重试幂等请求。它知道重复请求将具有相同的预期效果,即使是原始的 请求成功,但响应可能不同。

PUT RFC说:

如果目标资源没有当前表示并且PUT成功创建了一个,那么源服务器必须通知 用户代理通过发送201(已创建)响应。如果是目标 资源确实具有当前表示和该表示 根据所包含的表示的状态成功修改,然后原始服务器必须发送200(OK)或204(无内容)响应,以指示成功完成 请求。

假设/ create将创建的资源存储在DB中,它应该在首次创建时返回201,在重试/创建时返回200吗?应该重新/创建在DB中再次存储相同的资源以符合PUT RFC吗?

rest http put idempotent
1个回答
1
投票

所以这个问题有点困惑。让我们看看我们是否可以解开它。

PUT /create

abcde

粗略地说:用/create代表abcde的状态。换句话说,消息的语义就是这样的

store(key => "/create", value => "abcde")

请注意,处理此消息两次产生的效果与处理消息一次相同。

store(key => "/create", value => "abcde")
store(key => "/create", value => "abcde")

请注意,我们对此处使用的密钥非常具体; PUT与目标资源的状态有关; PUT /create是一条消息,要求我们修改/create,而不是我们创建其他资源的请求。

假设/ create将创建的资源存储在DB中,它应该在首次创建时返回201,在重试/创建时返回200吗?

是。

应该重新/创建在DB中再次存储相同的资源以符合PUT RFC吗?

如果资源已具有请求的表示,则无需再次存储它。

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