我一直在寻找最佳实践,以防止在使用 POST 创建新资源时意外创建重复资源,以防资源由服务器命名,因此无法使用 PUT。我正在构建的 API 将被移动客户端使用,我担心的情况是客户端在提交 POST 请求后但在收到响应之前断开连接。我找到了这个问题,但没有提到使用条件 POST,因此我提出了问题。
对父资源执行条件 POST,类似于使用条件 PUT 修改资源,是解决此问题的合理方法吗?如果不是,为什么不呢?
客户端/服务器交互就像条件 PUT 一样:
客户端获取父资源,包括反映其当前状态的 ETag(包括其从属资源),
客户端对父资源执行条件 POST(在 If-Match 标头中包含父资源的 ETag 值)以创建新资源,
客户端在得到服务器响应之前就断开了连接,所以不知道它是否成功,
稍后,当重新连接时,客户端重新提交相同的条件 POST 请求,
较早的请求未到达服务器,因此服务器创建资源并回复 201,或者较早的请求确实到达了服务器,因此服务器回复 412 并且未创建重复的资源。