我们的RESTful API的一部分将允许用户使用序列号注册项目。由于序列号不是全球唯一的,因此它不能用作资源的标识符,所以我们将使用一个POST到父资源,这将生成一个标识符,例如,响应幂等HTTP 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" />
这是否合理?我并不完全清楚位置或内容位置是否更适合第二种情况。
嗯,其实我喜欢这个。尽管序列号可能不是全球唯一的,但它们在用户范围内是唯一的,几乎有100%的概率,因此它可以作为范围唯一标识符。这也解决了我的问题,设备如何通过在此URL上使用GET来检查它是否已被注册,并检查响应是否为200或404。 – 2010-08-18 09:04:58