PUT请求可以更改URL吗?

时间:2016-03-07 11:51:13

标签: api rest http put

我的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标题是什么。

2 个答案:

答案 0 :(得分:4)

通过更改资源标识符,我了解到您正在删除资源并创建新资源。因此,您在问题中描述的方法基本上是使用错误 HTTP谓词的删除操作。

根据RFC 7231,HTTP / 1.1的当前引用,PUT请求用于创建或替换资源:

  

4.3.4. PUT

     

PUT方法请求目标资源的状态   创建替换与表示法定义的状态   包含在请求消息有效负载中。

     

[...]

     

如果目标资源没有当前表示而且   PUT成功创建一个,然后原始服务器必须通知   用户代理通过发送201(已创建)响应。如果是目标   资源确实具有当前表示和该表示   根据所附的状态成功修改   表示,然后原始服务器必须发送200(OK)或   一个204(无内容)回复表示成功完成了   请求。

     

[...]

当需要更改资源标识符时,我会执行以下操作:

  • 在现有资源中执行DELETE。响应将是204,表示请求已完成。

  • 执行POSTPUT以使用新标识符创建资源。响应将是201,表示资源已创建。响应将包含一个Location标头,指示资源的位置。

  • 要替换目标资源的状态(保留资源标识符),请执行PUT并返回204以指示操作成功。

我不了解您的要求,但我不允许用户更改或创建资源的标识符。我会假设资源标识符是不可变的,应该由应用程序生成(例如UUID)或数据库生成的标识符。

答案 1 :(得分:2)

我同意CássioMazzochiMolin的回答。然而,问题是理论问题,重命名资源是否真的改变了资源的“身份”。

例如,如果某个人的姓名发生变化,则不会改变该人的姓名。我仍然希望URI我之前为“同一”人工作,即使在名称更改后也是如此。

所以我想我的观点是不要将非身份相关信息包含在URI中。添加Id number或类似内容无关的信息。

如果对象的身份没有改变,请不要向DELETEPUT与另一个URI(不要重新定位资源)。