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