有没有办法重定向201回答?
RFC指定必须在Location
标头中指定新创建的资源,并且我确实指定了它。我假设浏览器会重定向,但它没有,即使页面没有内容。
我希望用户在POST操作后重定向到新资源。因此我很想使用303 See Other
,但201似乎更合适。
那么,有没有办法在没有用户干预且不依赖Javascript的情况下自动重定向流行的浏览器?
答案 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
的响应的页面,他们会重新发送帖子数据。我会在这里留下答案,以防其他人有同样的好主意。