【发布时间】:2010-11-16 15:25:39
【问题描述】:
根据 HTTP 规范:
如果已在 源服务器,响应应该 为 201(已创建)并包含一个实体 它描述了状态 请求并引用新的 资源和 Location 标头 (见第 14.30 节)。
这是否意味着 POST 请求应始终在 Location 标头中发送重定向 URI 而没有响应正文?
【问题讨论】:
标签: http
根据 HTTP 规范:
如果已在 源服务器,响应应该 为 201(已创建)并包含一个实体 它描述了状态 请求并引用新的 资源和 Location 标头 (见第 14.30 节)。
这是否意味着 POST 请求应始终在 Location 标头中发送重定向 URI 而没有响应正文?
【问题讨论】:
标签: http
指定响应正文和同时使用 Location 标头是完全可以接受的。当使用带有 201 响应的 Location 标头时,您并没有重定向客户端,您只是告诉它将来可以在哪里找到资源。
重定向仅适用于 3xx 响应。
W3C docs for this 进一步解释,虽然文字实际上很模棱两可:
Location 响应头字段用于将接收者重定向到 Request-URI 以外的位置,以完成请求或识别新资源。对于 201(已创建)响应,位置是请求创建的新资源的位置。对于 3xx 响应,位置应该指示服务器的首选 URI,以便自动重定向到资源。
我读到它的意思是“...重定向...或... identif[y]...新资源”,但这并不是一个简单的英文句子。
【讨论】:
基于paragraph 9.5 of the HTTP 1.1 specification,这是此类问题的参考,以下是我的理解:
是的,你可以,并且规范清楚地说明了你可以做什么以及如何去做:
POST方法执行的操作可能不会产生可由 URI 识别的资源。在这种情况下,200(正常)或204(无内容)是适当的响应状态,具体取决于响应是否包含描述结果的实体。如果在源服务器上创建了资源,则响应应该是
201(已创建)并包含一个描述请求状态并引用新资源的实体,以及一个 Location 标头(参见第 14.30 节) )。对此方法的响应不可缓存,除非响应包含适当的
Cache-Control或Expires标头字段。但是,303(请参阅其他)响应可用于指示用户代理检索可缓存资源。
【讨论】: