简短回答
它不是HTTP响应代码,但在WhatWG文档中被记录为XMLHttpRequest
或Fetch响应的状态属性的有效值。
广义上来说,当没有“真正”的HTTP状态码报告和/或发送请求或接收响应时出现错误时,它是使用的默认值。可能出现这种情况的情形包括但不限于:
- 请求尚未发送或已中止。
- 浏览器仍在等待接收响应状态和标头。
- 请求期间连接中断。
- 请求超时。
- 请求遇到无限重定向循环。
- 浏览器知道响应状态,但由于与Same-origin Policy相关的安全限制而无法访问它。
详细回答
首先,重申一下:0不是HTTP状态码。在
RFC 7231 Section 6.1中有一个完整的列表,其中不包括0,而第6节的介绍清楚地说明了:
状态码元素是一个三位数字代码
其中0不是。
然而,XMLHttpRequest对象的.status属性的值为0是有文档记录的,尽管跟踪所有相关细节有点棘手。我们从
https://xhr.spec.whatwg.org/#the-status-attribute开始记录
.status
属性,它只是简单地声明:
status
属性必须返回
响应的
状态。
这可能听起来空洞和自指,但实际上这里有信息!请记住,此文档在谈论
XMLHttpRequest
的
.response
属性,而不是响应,因此这告诉我们 XHR 对象上状态的定义被推迟到 Fetch 规范中响应状态的定义。
但是哪个响应对象?如果我们还没有收到响应怎么办?单词“响应”上的内联链接将带我们到
https://xhr.spec.whatwg.org/#response,其中解释了:
XMLHttpRequest
有一个关联的响应。除非另有说明,否则它是 网络错误。
所以我们获取状态的响应默认为网络错误。通过搜索 XHR 规范中使用短语“设置响应”的所有地方,我们可以看到它在五个位置设置:
查看获取标准,我们可以看到:
网络错误是一种响应,其状态始终为0
因此,我们可以立即得知,在XHR规范中,任何情况下响应应设置为网络错误时,XHR对象的状态都将显示为0。(有趣的是,这包括了流体的“出错”情况,Fetch规范告诉我们在接收状态后解析正文期间可能会发生这种情况-因此理论上我认为XHR对象可能会将其状态设置为200,然后在接收正文时遇到内存不足错误或其他问题,从而将其状态更改回0。)
我们还在Fetch标准中注意到存在另外几种响应类型,其状态被定义为0,其存在与跨域请求和同源策略有关:
不透明过滤响应是一个
过滤响应,其状态为
0
...
不透明重定向过滤响应是一个
过滤响应,其状态为
0
...
(省略了这两种响应类型的其他细节)。
但除此之外,还有许多情况下,
Fetch算法(而非我们已经查看过的XHR规范)要求浏览器返回网络错误!事实上,在Fetch标准中“返回网络错误”的短语出现了
40次。我不会在此列出所有40个条目,但需要注意的是:它们包括:
- 请求方案无法识别的情况(例如尝试将请求发送到madeupscheme:// foobar.com)
- 处理ftp://和file:// URL算法中的模棱两可的指令“当有疑问时,请返回网络错误。”
- 无限重定向:“如果请求的重定向计数为20,则返回网络错误。”
- 一堆与CORS相关的问题,例如“如果httpRequest的响应污染不是“cors”,并且请求和响应的跨源资源策略检查返回blocked,则返回网络错误。”
- 连接失败:“如果connection失败,则返回网络错误。”
换句话说:每当出现问题,而不是从服务器获得真正的HTTP错误状态代码(如500或400),您在浏览器中的XHR对象或Fetch响应对象上会得到状态属性0。规范中列出了大量可能的具体原因。
最后提醒:如果你对规范的历史感兴趣,注意这个答案已于2020年完全重写。你可能会对此答案的先前版本感兴趣,它从旧版(更为简单的)XHR W3规范中解析出基本相同的结论,而这些规范已被更现代、更复杂的WhatWG规范所取代。