我一直在REST API中使用POST来创建对象.每隔一段时间,服务器就会创建一个对象,但客户端会在收到201 Created响应之前断开连接.客户端只能看到失败的POST请求,稍后再次尝试,服务器会愉快地创建一个重复的对象......
其他人一定有这个问题吧?但我谷歌周围,每个人似乎都忽略了它.
我有2个解决方案:
A)改为使用PUT,并在客户端上创建(GU)ID.
B)向客户端上创建的所有对象添加GUID,并让服务器强制执行UNIQUE-ness.
A与现有框架不匹配,B感觉就像是黑客.在现实世界中,其他人如何解决这个问题?
编辑:
使用Backbone.js,您可以在客户端上创建对象时将GUID设置为id.保存后,Backbone将执行PUT请求.让你的REST后端处理PUT到不存在的id,然后你就设置了.
我们最近注意到一个问题,其中一些用户代理会重复相同的POST请求而用户实际上不会实际触发它两次.
在进一步研究之后,我们注意到这只发生在请求通过我们的负载均衡器并且服务器花了很长时间来处理请求时.数据包捕获会话最终显示负载均衡器在超时5分钟后通过向客户端发送TCP重置来断开连接; 但是,客户端会在没有用户干预的情况下自动重新提交请求.
我们在Apache HTTP客户端中观察到Java,Firefox和IE 8的这种行为.(我无法安装其他浏览器进行测试.)这让我觉得这种行为是HTTP标准的一部分,但这对Google来说并不容易.
此外,似乎只有在通过保持活动的TCP连接提交第一个请求时才会发生这种情况.