响应幂等HTTP POST请求

时间:2010-08-11 12:19:35

标签: http rest http-post

我们的RESTful API的一部分将允许用户注册带有序列号的项目。由于序列号不是全局唯一的,因此不能用作资源的标识符,因此我们将对父资源使用POST来生成标识符,例如

POST /my/items

<item serial-number="ABCDEF" />

如果项目尚未注册,则可以很好地定义HTTP语义。我们返回一个Location标头,并将注册的项目作为实体主体,例如

HTTP 201 Created
Location: /my/items/1234    

<item id="1234" serial-number="ABCDEF" />

但是,在项目已经注册的情况下,API应该是幂等的并且返回先前注册的项目而不创建新项目。我最好的猜测是,它应该返回200 OK状态代码,并使用Content-Location标头指示项目实际来自哪里,例如。

HTTP 200 OK
Content-Location: /my/items/1234    

<item id="1234" serial-number="ABCDEF" />

这看起来合情合理吗?我不完全清楚位置或内容位置在第二种情况下是否更合适。

2 个答案:

答案 0 :(得分:7)

我最近有类似的要求。对于幂等运算,PUT是最好的方法。你是对的,外部id和内部id不匹配。我通过为外部id目标创建专用资源来解决它:

PUT /api-user/{username}/items/{serialNumber}

在内部我将其解析为CREATE,以防我没有'username'和'ABCDEF'序列号或UPDATE项目。

如果它是CREATE,我返回201以获得UPDATE 200.此外,返回的有效负载包含本地ID和您在有效负载中建议的外部序列号。

答案 1 :(得分:1)

Here是关于两个标题的用法的有趣讨论。它声称Content-Location没有为PUT或POST定义,因此在您的情况下,Location可能是更好的选择。当然不是很明确,但是哪个更好。

总的来说,我觉得你的方法很有意义。

相关问题