Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
响应幂等HTTP POST请求_Http_Rest_Http Post - Fatal编程技术网

响应幂等HTTP POST请求

响应幂等HTTP POST请求,http,rest,http-post,Http,Rest,Http Post,我们的RESTful API的一部分将允许用户使用序列号注册一个项目。由于序列号不是全局唯一的,它不能用作资源的标识符,因此我们将使用对父资源的POST,该POST将生成标识符,例如 POST /my/items <item serial-number="ABCDEF" /> POST/my/items 在项目尚未注册的情况下,HTTP语义定义良好。我们返回一个位置头,注册项作为实体体,例如 HTTP 201 Created Location: /my/items/1234

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

POST /my/items

<item serial-number="ABCDEF" />
POST/my/items
在项目尚未注册的情况下,HTTP语义定义良好。我们返回一个位置头,注册项作为实体体,例如

HTTP 201 Created
Location: /my/items/1234    

<item id="1234" serial-number="ABCDEF" />
http201已创建
位置:/my/items/1234
但是,在项目已经注册的情况下,API应该是幂等的,并返回以前注册的项目,而不创建新的项目。我的最佳猜测是,它应该返回一个200 OK状态代码,并使用Content Location头来指示项目的实际来源,例如

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

<item id="1234" serial-number="ABCDEF" />
http200正常
内容位置:/my/items/1234
这看起来合理吗?我不完全清楚位置还是内容位置更适合第二种情况。

是关于两个标题用法的有趣讨论。它声称内容位置未定义为PUT或POST,因此在您的情况下,位置可能是更好的选择。当然,哪一个更好还不清楚


总的来说,我认为你的方法是有道理的。

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

PUT /api-user/{username}/items/{serialNumber}
在内部,如果我没有“用户名”和“ABCDEF”序列号的项目,我会将其解析为CREATE,如果有,则会进行更新


如果它是更新200的CREATE I return 201。此外,返回的有效负载包含本地id和外部序列号,就像您在有效负载中建议的那样

这篇文章缺少了一点,它说内容位置没有为PUT和POST定义,HTTP规范实际上说它没有为请求定义,但没有说任何关于响应的内容。我认为,说内容位置是用于替代形式,而位置是实际位置可能是正确的。从规格上很难确定:-嗯,是的,实际上我喜欢这个。虽然序列号可能不是全局唯一的,但它们在用户范围内是唯一的概率几乎为100%,因此它可以充当范围唯一标识符。它还将解决我的问题,即设备如何通过使用此URL上的GET并检查响应是200还是404来检查它是否已经注册。谢谢