我的HTTP API应用程序提供了一些按名称标识的资源。因此,URL构造如下:
/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
标头?是否可以返回Location
状态的204 No content
标题?
在写完这个问题之后,我找到了另一个非常相似的问题:querySelector
接受的答案是允许,但不推荐。但是仍然不知道Location
标题是什么。
答案 0 :(得分:4)
通过更改资源标识符,我了解到您正在删除资源并创建新资源。因此,您在问题中描述的方法基本上是使用错误 HTTP谓词的删除操作。
根据RFC 7231,HTTP / 1.1的当前引用,PUT
请求用于创建或替换资源:
PUT
方法请求目标资源的状态 创建或替换与表示法定义的状态 包含在请求消息有效负载中。[...]
如果目标资源没有当前表示而且
PUT
成功创建一个,然后原始服务器必须通知 用户代理通过发送201
(已创建)响应。如果是目标 资源确实具有当前表示和该表示 根据所附的状态成功修改 表示,然后原始服务器必须发送200
(OK)或 一个204
(无内容)回复表示成功完成了 请求。[...]
当需要更改资源标识符时,我会执行以下操作:
在现有资源中执行DELETE
。响应将是204
,表示请求已完成。
执行POST
或PUT
以使用新标识符创建资源。响应将是201
,表示资源已创建。响应将包含一个Location
标头,指示资源的位置。
要替换目标资源的状态(保留资源标识符),请执行PUT
并返回204
以指示操作成功。
我不了解您的要求,但我不允许用户更改或创建资源的标识符。我会假设资源标识符是不可变的,应该由应用程序生成(例如UUID)或数据库生成的标识符。
答案 1 :(得分:2)
我同意CássioMazzochiMolin的回答。然而,问题是理论问题,重命名资源是否真的改变了资源的“身份”。
例如,如果某个人的姓名发生变化,则不会改变该人的姓名。我仍然希望URI
我之前为“同一”人工作,即使在名称更改后也是如此。
所以我想我的观点是不要将非身份相关信息包含在URI
中。添加Id number
或类似内容无关的信息。
如果对象的身份没有改变,请不要向DELETE
和PUT
与另一个URI
(不要重新定位资源)。