可以请求更改URL?
我的HTTP API应用程序提供了一些通过名称标识的资源。 因此,这些网址的构建方式如下:
/path/to/resources/<name>
例如:
/path/to/resources/my_resource
可以使用PUT操作更新资源。 也可以使用这种更新来重命名资源。
PUT /path/to/resources/my_resource
{"name": "new_name", <other properties>}
响应:
HTTP/1.1 204 No content
因此,现在可以通过新的URL访问更新后的资源:
GET /path/to/resources/new_name
响应:
HTTP/1.1 200 OK
{"name": "new_name", <other properties>}
旧网址不再有效:
GET /path/to/resources/my_resource
响应:
HTTP/1.1 404 Not found
这种行为是否正确? PUT操作是否应该使用新的URL返回Location
标头? 返回具有204 No content
状态的Location
标题是否可以?
在写完这个问题之后,我发现了另一个非常相似的东西:REST API设计:在PUT调用期间更改资源标识符可以吗? 接受的答案是允许的,但不推荐。 尽管如此,仍然不知道Location
标题。
通过更改资源标识符,我知道您正在删除资源并创建一个新资源。 所以,你在问题中描述的方法基本上是使用错误的HTTP动词的删除操作。
根据RFC 7231,HTTP / 1.1的当前参考, PUT
请求用于创建或替换资源:
4.3.4。 放
PUT
方法请求创建目标资源的状态或用请求消息负载中包含的表示定义的状态替换目标资源的状态。
[...]
如果目标资源没有当前的表示,并且PUT
成功创建一个,那么源服务器必须通过发送201
(创建)响应来通知用户代理。 如果目标资源确实有当前的表示形式,并且根据所包含表示的状态成功修改了表示形式,那么源服务器必须发送200
(OK)或204
(无内容)响应以指示成功完成请求。
[...]
当资源标识符需要更改时,我会执行以下操作:
在现有资源中执行DELETE
。 响应将是204
表示请求已完成。
执行POST
或PUT
以使用新标识符创建资源。 响应将是201
表示资源已创建。 该响应将包含指示资源所在Location
标题。
要替换目标资源的状态(保留资源标识符),请执行PUT
并返回204
以指示操作成功。
我不知道您的要求,但我不会允许用户更改或创建资源的标识符。 我会假设资源标识符是不可变的 ,应由应用程序(例如UUID)或由数据库生成的标识符生成。
我同意CássioMazzochi Molin的回答。 然而,问题是理论上的问题,重命名资源是否真的改变了资源的“身份”。
例如,如果一个人的名字改变了,那不会改变这个人是谁。 我仍然希望我以前为“同一个”人获得的URI
工作,即使名称更改后也是如此。
所以我想我的观点并不是将非身份相关的信息包含在URI
。 包含一个Id number
或类似的与内容无关的信息。
如果对象的标识没有改变,则不要执行DELETE
和PUT
到另一个URI
(不要重新定位资源)。