7

RESTful Web 服务鼓励使用HTTP 303将客户端重定向到资源的规范表示。它仅在HTTP GET.

这是否也适用于其他 HTTP 方法?如果客户端尝试使用HTTP PUTDELETE访问非规范 URI,是否可以接受(和/或推荐)返回 HTTP 303?最佳做法是什么,为什么?

4

2 回答 2

8

此状态码通常适用于任何 HTTP 方法。它主要用于允许 POST 操作的输出以将用户代理重定向到选定的资源,因为这样做可以提供与 POST 响应相对应的信息,该信息可以独立于原始的形式单独识别、添加书签和缓存要求。

来源https ://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p2-semantics-21#section-7.4.4

于 2012-11-30T09:41:32.747 回答
6

我刚刚在书中发现了一个有趣的部分。根据第 378 页部分302 ("Found")

此状态码是大多数与重定向相关的混淆的最终来源。它应该像 307(“临时重定向”)一样处理。事实上,在 HTTP 1.0 中,它的名称是“临时移动”。不幸的是,在现实生活中,大多数客户端处理 302 就像处理 303(“查看其他”)。差异取决于客户端在响应PUT、POST 或 DELETE请求时收到 302 时应该做什么。如果您对详细信息感兴趣,请参阅下面的 307 条目。

为了解决这种歧义,在 HTTP 1.1 中,此响应代码被重命名为“Found”,并创建了响应代码 307。

换句话说,HTTP 302 被拆分为 HTTP 303 和 307。接下来,在第 380 页部分307 ("Temporary Redirect")

对于 GET 请求,唯一被请求的是服务器发送一个表示,此状态码与 303 相同(“查看其他”)。307 是对 GET 的良好响应的典型情况是服务器想要将客户端发送到镜像站点时。但是对于POST、PUT 和 DELETE 请求,服务器应该采取一些行动来响应请求,这个状态码与 303 有很大的不同。

响应POST、PUT 或 DELETE的 303表示操作已成功,但响应实体主体未与此请求一起发送。如果客户端想要响应实体主体,它需要向另一个 URI 发出 GET 请求。响应 POST、PUT 或 DELETE 的 307 意味着服务器甚至没有尝试执行该操作。客户端需要将整个请求重新提交到Location标头中的 URI。

换句话说,HTTP POST、PUT、DELETE 在 HTTP 303、307 上是合法的。上一段解释了预期的行为。

话虽这么说,我在这里引用了这本书,而不是 HTTP 规范(它对预期的行为可疑地保持沉默)。

于 2012-11-29T23:59:22.153 回答