HTTP POST请求是否允许发送响应体?

65
根据HTTP规范规定,如果资源是在源服务器上创建的,则响应应该是201(已创建),并包含描述请求状态和引用新资源的实体以及Location头 (参见14.30节)。这是否意味着POST请求应始终在Location标头中发送重定向URI且无响应正文?
2个回答

62

在使用 Location 头部和 201 响应时,同时指定响应体是完全可以接受的。这并不是在重定向客户端,而是在告诉它未来可以在哪里找到资源。仅当使用 3xx 响应时才会进行重定向。

W3C 文档进一步解释了此问题,但实际上文本有些模糊:

Location 响应头字段用于将收件人重定向到除 Request-URI 之外的位置,以完成请求或标识新资源。对于 201 (Created) 响应,Location 是由请求创建的新资源的位置。对于 3xx 响应,Location 应指示服务器首选的 URI 自动重定向到该资源。

我理解为“重定向”或“标识新资源”,但这并不是一个十分通俗易懂的英语句子。


9
答案是“简而言之,不行”还是“您可以指定响应正文并同时使用位置标头”? - Suresh Kumar
6
我回答的是正文末尾的问题,而不是标题中的问题。 - Rob Knight
我也是这么想的。只是想再确认一遍。 谢谢,Rob。 - Suresh Kumar
我想,脑海中浮现的问题是:在响应体中发送数据是否有意义?客户端会使用它吗?还是只是丢弃并获取新资源?我想这取决于客户端的实现,不是吗? - cassepipe

27

根据HTTP 1.1规范第9.5段的规定,以下是我的理解:

可以进行POST请求,并且规范清楚地说明了可以做什么以及如何做:

POST方法执行的操作可能不会导致可以通过URI标识的资源。在这种情况下,响应状态码应该是200(OK)或204(No Content),具体取决于响应是否包含描述结果的实体。

如果在源服务器上创建了一个资源,则响应应该是201(Created),并包含一个描述请求状态和引用新资源的实体,以及一个Location头字段(见第14.30节)。

该方法的响应不能被缓存,除非响应包括适当的Cache-ControlExpires头字段。但是,303(See Other)响应可用于指示用户代理检索可缓存的资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接