我们的RESTful应用程序接口的一部分将允许用户使用序列号注册项目。由于序列号不是全局唯一的,它不能用作资源的标识符,因此我们将使用到父资源的POST,这将生成一个标识符,例如
POST /my/items
<item serial-number="ABCDEF" />在项目尚未注册的情况下,HTTP语义是定义良好的。我们返回一个Location头,并将注册项作为实体主体,例如
HTTP 201 Created
Location: /my/items/1234
<item id="1234" serial-number="ABCDEF" />但是,在项已经注册的情况下,API应该是幂等的,并且返回先前注册的项而不创建新项。我最好的猜测是,它应该返回一个200OK状态码,并使用Content-Location标头来指示项目的实际来源,例如
HTTP 200 OK
Content-Location: /my/items/1234
<item id="1234" serial-number="ABCDEF" />这看起来合理吗?我不完全清楚在第二种情况下,Location和Content-Location哪个更合适。
发布于 2010-08-12 06:28:57
我最近也有类似的要求。对于幂等运算,PUT是最好的方法。您说得对,外部id和内部id之间存在不匹配。我通过为外部id目标创建一个专用资源来解决这个问题:
PUT /api-user/{username}/items/{serialNumber}在内部,我将其解析为CREATE,以防没有'username‘和'ABCDEF’序列号的条目,或者没有UPDATE的条目。
如果是CREATE,我返回201以获取更新200。此外,返回的有效负载包含本地id和外部序列号,正如您在有效负载中所建议的那样。
发布于 2010-08-11 20:27:04
Here是关于这两个头的用法的有趣讨论。它声称没有为PUT或POST定义Content-Location,因此Location在您的情况下可能是更好的选择。当然,哪个更好还不是很清楚。
总的来说,我认为你的方法是有意义的。
https://stackoverflow.com/questions/3458121
复制相似问题