Avoid duplicate POSTs with REST

geon picture geon · Mar 1, 2013 · Viewed 37.9k times · Source

I have been using POST in a REST API to create objects. Every once in a while, the server will create the object, but the client will be disconnected before it receives the 201 Created response. The client only sees a failed POST request, and tries again later, and the server happily creates a duplicate object...

Others must have had this problem, right? But I google around, and everyone just seems to ignore it.

I have 2 solutions:

A) Use PUT instead, and create the (GU)ID on the client.

B) Add a GUID to all objects created on the client, and have the server enforce their UNIQUE-ness.

A doesn't match existing frameworks very well, and B feels like a hack. How does other people solve this, in the real world?

Edit:

With Backbone.js, you can set a GUID as the id when you create an object on the client. When it is saved, Backbone will do a PUT request. Make your REST backend handle PUT to non-existing id's, and you're set.

Answer

Chris Toomey picture Chris Toomey · Apr 12, 2013

Another solution that's been proposed for this is POST Once Exactly (POE), in which the server generates single-use POST URIs that, when used more than once, will cause the server to return a 405 response.

The downsides are that 1) the POE draft was allowed to expire without any further progress on standardization, and thus 2) implementing it requires changes to clients to make use of the new POE headers, and extra work by servers to implement the POE semantics.

By googling you can find a few APIs that are using it though.

Another idea I had for solving this problem is that of a conditional POST, which I described and asked for feedback on here.

There seems to be no consensus on the best way to prevent duplicate resource creation in cases where the unique URI generation is unable to be PUT on the client and hence POST is needed.