rest - 是否还有 HTTP 301 而不是 HTTP 308 的用例来指示资源已移动(尤其是在 ReST 服务器中)?
问题描述
我正在指定一个 ReST 服务。我最近偶然发现了这个IETF 草案文件,它可能被解释为建议 ReST 服务应该总是返回 308。请注意,该文件似乎已经过期而没有被取代(我对 IETF 流程不是很清楚)。
我之前的想法是,服务应该为 GET 返回“301 Moved Permanently”,为 POST 返回“ 308 Permanent Redirect ”,以确保它不会被不恰当地转换为 GET(通过一些试图变得聪明的东西)。
301 和 308 的使用似乎都是用应该和不应该而不是必须和必须不来表达的,所以在哲学上还不清楚什么是“正确的事情”。
GET 的 301 和 POST 的 308 应该有效。GET 的 308 没有错误,因为在撰写本文时的当前版本包括响应 GET 生成 308 的示例。现在有一个部署问题,如果客户不理解 308,它应该将其视为 300(而不是 301,这对我来说更有意义)但是 308 现在已被广泛理解,所以问题变成了你是否应该或为什么应该使用 HTTP 301?
如果 308 本质上是对 301 的错误修复,为什么 301 没有在 HTTP/1.1 中正式弃用?是否有合法的用例将 POST 转换为 GET 以在 ReST 中或更一般地在 HTTP 中进行重定向?
对于 301 HTTP/1.1 说:
注意:由于历史原因,用户代理可以将后续请求的请求方法从 POST 更改为 GET。
为什么这是一个好主意?它在任何地方仍然有效吗?
也可以看看:
- HTTP 301 和 308 状态码有什么区别? 它很好地涵盖了 301 和 308 之间的差异,但没有涵盖这一点。
- Restful API 的客户端应该如何处理 POST 时的 http 状态 301 重定向?
- HTTP状态码308是怎么回事?
解决方案
如果
308
本质上是一个 bug 修复301
,为什么301
在 HTTP/1.1 中没有正式弃用?
不,这不对。
定义状态代码的RFC 7538308
不会无效或301
过时。它只是定义了另一个状态代码来填补RFC 7231的空白,它没有定义状态代码的永久变体307
:
+-------------------------------------------+-----------+-----------+
| | Permanent | Temporary |
+-------------------------------------------+-----------+-----------+
| Allows changing the request method from | 301 | 302 |
| POST to GET | | |
| Does not allow changing the request | - | 307 |
| method from POST to GET | | |
+-------------------------------------------+-----------+-----------+
实际上,我仍然看到301
主要用于 SEO。而且我看到一些 HTTP 客户端无法识别308
.
除了 RFC,让我们看看 Mozilla 的 MDN Web Docs 是怎么说的301
:
超文本传输协议 (HTTP)
301 Moved Permanently
重定向状态响应代码指示请求的资源已明确移动到 Location 标头给出的 URL。浏览器重定向到这个页面并且搜索引擎更新他们到资源的链接(在'SEO-speak'中,据说'link-juice'被发送到新的URL)。即使规范要求在执行重定向时不要更改方法(和主体),但并非所有用户代理都与它保持一致 - 您仍然可以在那里找到这种类型的错误软件。因此,建议
301
仅将代码用作GET
orHEAD
方法的响应,而改用308 Permanent Redirect
forPOST
方法,因为在此状态下明确禁止更改方法。
现在看看 Mozilla 是怎么说的308
:
超文本传输协议 (HTTP)
308 Permanent Redirect
重定向状态响应代码指示请求的资源已明确移动到Location
标头给出的 URL。浏览器重定向到这个页面并且搜索引擎更新他们到资源的链接(在'SEO-speak'中,据说'link-juice'被发送到新的URL)。请求方法和正文不会被更改,而
301
有时可能会错误地更改为GET
方法。注意:某些 Web 应用程序可能会以
308 Permanent Redirect
非标准方式和其他目的使用 。例如,308 Resume Incomplete
当不完整的上传停止时,Google Drive 使用响应向客户端指示。(参考)
推荐阅读
- javascript - 如何退出函数和 addEventListener?返回不工作?
- javascript - 使用 react js 从用户输入中创建 json 数组
- arrays - 使用数组比较列值 - PostgreSQL
- reactjs - 在单个组件类组件中反应本机多个操作表在 android 中工作正常但在 ios 中不起作用
- javascript - 我无法使用 javascript 在表格中插入单元格
- kotlin - 如何在tornadofx中获取鼠标按住事件
- c++ - 如何将c ++中指针指向的数据保存到txt文件?
- ruby-on-rails - 如何为#index 编写好的请求规范?
- pickle - 有没有办法在 Python 3.8 中加载 Python 3.6 泡菜?
- azure-devops - 如何使用 Azure DevOps 中的“ARM 模板部署”任务覆盖 ARM 模板中的密钥保管库引用参数