根据HTTP规范规定,如果资源是在源服务器上创建的,则响应应该是201(已创建),并包含描述请求状态和引用新资源的实体以及Location头 (参见14.30节)。这是否意味着POST请求应始终在Location标头中发送重定向URI且无响应正文?
在使用 Location 头部和 201 响应时,同时指定响应体是完全可以接受的。这并不是在重定向客户端,而是在告诉它未来可以在哪里找到资源。仅当使用 3xx 响应时才会进行重定向。
W3C 文档进一步解释了此问题,但实际上文本有些模糊:
Location 响应头字段用于将收件人重定向到除 Request-URI 之外的位置,以完成请求或标识新资源。对于 201 (Created) 响应,Location 是由请求创建的新资源的位置。对于 3xx 响应,Location 应指示服务器首选的 URI 自动重定向到该资源。
我理解为“重定向”或“标识新资源”,但这并不是一个十分通俗易懂的英语句子。
根据HTTP 1.1规范第9.5段的规定,以下是我的理解:
可以进行POST请求,并且规范清楚地说明了可以做什么以及如何做:
POST
方法执行的操作可能不会导致可以通过URI标识的资源。在这种情况下,响应状态码应该是200
(OK)或204
(No Content),具体取决于响应是否包含描述结果的实体。如果在源服务器上创建了一个资源,则响应应该是
201
(Created),并包含一个描述请求状态和引用新资源的实体,以及一个Location头字段(见第14.30节)。该方法的响应不能被缓存,除非响应包括适当的
Cache-Control
或Expires
头字段。但是,303
(See Other)响应可用于指示用户代理检索可缓存的资源。