使用201创建重定向

时间:2011-01-03 13:15:25

标签: http http-status-codes

有没有办法重定向201回答?

RFC指定必须在Location标头中指定新创建的资源,并且我确实指定了它。我假设浏览器会重定向,但它没有,即使页面没有内容。

我希望用户在POST操作后重定向到新资源。因此我很想使用303 See Other,但201似乎更合适。

那么,有没有办法在没有用户干预且不依赖Javascript的情况下自动重定向流行的浏览器?

4 个答案:

答案 0 :(得分:21)

我认为你混淆了两种不同的语义响应 - 一种是告诉客户你成功创建了一个资源,以及它在哪里。客户是否去取得它是一个不同的故事。

第二个是告诉客户端它已经为它正在请求的资源发送了错误的位置URI - 它应该再次尝试,但使用不同的URI。

在这种情况下,303是合适的 - 实际上,明确建议这样做:

(来自rfc

它主要用于允许POST操作的输出将用户代理重定向到选定的资源,因为这样做可以单独识别,添加书签和缓存的形式提供与POST响应相对应的信息,独立于原始请求。

答案 1 :(得分:4)

浏览器将通过其中一个3xx状态代码执行重定向操作,规范未定义用户代理必须重定向201.您可以尝试发送刷新标头以查看如果它强制重定向到Location标题,但我不会指望它。为什么不坚持3xx响应?

答案 2 :(得分:2)

您可以发送Refresh标题。

答案 3 :(得分:1)

我第一次处理这个问题,这就是我决定做的事情:

  • GET /user/new - > 200 Ok用户注册表。
  • POST /user - > 201 Created新用户使用与GET /user路径相同的内容进行回复。
  • GET /user - > 200 Ok包含经过身份验证的用户的用户个人资料页面,或者对于匿名访问者307 Temporary Redirect/login,其链接到/user/new

<强>更新

我发现这是一个坏主意,因为如果用户刷新呈现为POST /user的响应的页面,他们会重新发送帖子数据。我会在这里留下答案,以防其他人有同样的好主意。