我的目标是创建idempotent / create REST API,它实现为PUT动词。
幂等方法是有区别的,因为请求可以是 如果在通信失败之前发生,则自动重复 客户端能够读取服务器的响应。例如,如果是 客户端发送PUT请求,底层连接关闭 在收到任何响应之前,客户端可以建立新的响应 连接并重试幂等请求。它知道重复请求将具有相同的预期效果,即使是原始的 请求成功,但响应可能不同。
PUT RFC说:
如果目标资源没有当前表示并且PUT成功创建了一个,那么源服务器必须通知 用户代理通过发送201(已创建)响应。如果是目标 资源确实具有当前表示和该表示 根据所包含的表示的状态成功修改,然后原始服务器必须发送200(OK)或204(无内容)响应,以指示成功完成 请求。
假设/ create将创建的资源存储在DB中,它应该在首次创建时返回201,在重试/创建时返回200吗?应该重新/创建在DB中再次存储相同的资源以符合PUT RFC吗?
所以这个问题有点困惑。让我们看看我们是否可以解开它。
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吗?
如果资源已具有请求的表示,则无需再次存储它。