HTTP状态代码0是否有任何含义?


91

看来,当您从浏览器中的脚本发出XMLHttpRequest时,如果浏览器设置为脱机工作或拔出了网络电缆,则该请求将以错误和状态= 0来完成。在允许范围内未列出0 HTTP状态代码。

状态码0是什么意思?对于所有浏览器以及所有HTTP客户端实用程序,这意味着同一件事吗?它是HTTP规范的一部分还是其他协议规范的一部分?这似乎意味着根本无法发出HTTP请求,这可能是因为无法解析服务器地址。

哪种错误消息适合显示给用户?“或者您没有连接到Internet,或者网站遇到了问题,或者地址中可能存在键入错误”?

我应该补充一点,当设置为“脱机工作”时,我会在FireFox中看到该行为,而当设置为“脱机工作”时,我不会在Microsoft Internet Explorer中看到该行为。在IE中,用户会看到一个对话框,其中提供了可供选择的联机选项。FireFox在返回错误之前不会通知用户。

我是为了响应“显示更好的错误消息”的请求而问这个。Internet Explorer的功能很好。它告诉用户是什么引起了问题,并为他们提供了解决问题的选项。为了提供与FireFox等效的UX,我需要推断问题的原因并通知用户。那么,我总共可以从状态0推断出什么?它具有普世意义还是什么都没告诉我?


请看到这个问题,它涵盖了同一主题:stackoverflow.com/questions/872206/...
斯科特斯塔福德

3
我相信这是最准确的答案: stackoverflow.com/a/14507670/700206
whitneyland

Answers:


153

简短答案

它不是HTTP响应代码,但被WhatWG记录为XMLHttpRequest或Fetch响应的status属性的有效值。

广义上讲,它是默认值,当没有真实的 HTTP状态代码可报告和/或在发送请求或接收响应时发生错误时使用。在这种情况下,可能的情况包括但不限于:

  • 该请求尚未发送或已中止。
  • 浏览器仍在等待接收响应状态和标头。
  • 请求期间连接断开。
  • 请求超时。
  • 该请求遇到无限重定向循环。
  • 浏览器知道响应状态,但是由于与“同源策略”相关的安全限制,因此您无法访问它。

长答案

首先,重申一下:0不是HTTP状态代码。RFC 7231第6.1节中有完整的列表,其中不包含0,第6节的简介清楚地指出:

状态码元素是一个三位数的整数代码

哪个不是0。

但是,记录了0作为.statusXMLHttpRequest对象的属性值,尽管要跟踪所有相关细节有些棘手。我们从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规范这个答案取代指。


53

当通过刷新页面或请求无法访问的URL获得响应之前,取消ajax调用后,状态0就会出现。

此状态未记录,但存在于gadget.io的ajax和makeRequest调用中。


4
您好,有什么方法可以区分失败(“无网络”)和已取消请求吗?
Ankur 2013年

2
该状态记录为XmlHttpRequest状态。当然,它不是http状态,但已记录在案。w3.org/TR/XMLHttpRequest/#the-status-attribute有关更多详细信息,请参见Mark Amery响应。
弗雷德里克


4

知道这是一个旧帖子。但是这些问题仍然存在。

以下是我对此主题的一些发现,对此进行了详尽的解释。

根据XMLHttpRequest规范,“状态” 0表示3件事之一:

  • dns名称解析失败(例如,拔出网络插头时)

  • 服务器没有应答(又称无法访问或无响应)

  • 由于CORS问题,请求被中止(由用户代理执行堕胎,并在OPTIONS试飞失败后进行)。

如果想进一步,请深入研究XMLHttpRequest的内部。我建议读取就绪状态更新序列([0,1,2,3,4]是正常序列,[0,1,4]对应于状态0,[0,1,2,4]表示没有内容发送,这可能是错误的,也可能不是)。您可能还希望将侦听器附加到xhr(onreadystatechange,onabort,onerror,ontimeout)以了解详细信息。

根据规格(XHR Living规格):

const unsigned short UNSENT = 0;
const unsigned short OPENED = 1;
const unsigned short HEADERS_RECEIVED = 2;
const unsigned short LOADING = 3;
const unsigned short DONE = 4;

1
此处您列表中的所有可能原因都是正确的,但列表并不详尽。例如,您错过了超时,无限重定向循环以及我的answer中详细说明的其他原因。但是,指向新的现行XHR规范的指针很有用;我应该更新答案以引用它,而不是旧的W3规范。
Mark Amery

0

从iOS 9开始,您需要在向非安全HTTP Web服务发出请求之前,将“应用程序传输安全设置”添加到info.plist文件中,并允许“允许任意加载”。我在我的一个应用中遇到了这个问题。


-1

是的,一些ajax调用如何终止。原因可能是以下原因。

  1. 在完成ajax请求之前,用户导航到其他页面。
  2. Ajax请求有超时。
  3. 服务器无法返回任何响应。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.