首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应幂等HTTP POST请求

响应幂等HTTP POST请求
EN

Stack Overflow用户
提问于 2010-08-11 20:19:35
回答 2查看 1.8K关注 0票数 6

我们的RESTful应用程序接口的一部分将允许用户使用序列号注册项目。由于序列号不是全局唯一的,它不能用作资源的标识符,因此我们将使用到父资源的POST,这将生成一个标识符,例如

代码语言:javascript
复制
POST /my/items

<item serial-number="ABCDEF" />

在项目尚未注册的情况下,HTTP语义是定义良好的。我们返回一个Location头,并将注册项作为实体主体,例如

代码语言:javascript
复制
HTTP 201 Created
Location: /my/items/1234    

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

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

代码语言:javascript
复制
HTTP 200 OK
Content-Location: /my/items/1234    

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

这看起来合理吗?我不完全清楚在第二种情况下,Location和Content-Location哪个更合适。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-12 06:28:57

我最近也有类似的要求。对于幂等运算,PUT是最好的方法。您说得对,外部id和内部id之间存在不匹配。我通过为外部id目标创建一个专用资源来解决这个问题:

代码语言:javascript
复制
PUT /api-user/{username}/items/{serialNumber}

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

如果是CREATE,我返回201以获取更新200。此外,返回的有效负载包含本地id和外部序列号,正如您在有效负载中所建议的那样。

票数 7
EN

Stack Overflow用户

发布于 2010-08-11 20:27:04

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

总的来说,我认为你的方法是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3458121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档