我们的RESTful API的一部分将允许用户注册带有序列号的项目.由于序列号不是全局唯一的,因此不能用作资源的标识符,因此我们将对父资源使用POST来生成标识符,例如
POST /my/items
在项目尚未注册的情况下,HTTP语义被很好地定义.我们返回一个Location标头,并将注册的项目作为实体主体,例如
HTTP 201 Created Location: /my/items/1234
但是,在项目已经注册的情况下,API应该是幂等的并返回先前注册的项目而不创建新项目.我最好的猜测是,它应该返回200 OK状态代码,并使用Content-Location标头指示项目实际来自哪里,例如
HTTP 200 OK Content-Location: /my/items/1234
这看起来合情合理吗?我不完全清楚位置或内容位置是否更适合第二种情况.
我最近有类似的要求.对于幂等运算,PUT是最好的方法.你是对的,外部id和内部id不匹配.我通过为外部id目标创建专用资源来解决它:
PUT /api-user/{username}/items/{serialNumber}
在内部我将其解析为CREATE,以防我没有'username'和'ABCDEF'序列号或UPDATE的项目.
如果它是CREATE,我返回201以获得UPDATE 200.此外,返回的有效负载包含本地ID和外部序列号,就像您在有效负载中建议的那样.