当您从浏览器中的脚本创建XMLHttpRequest时,如果浏览器设置为脱机工作或拔出网络电缆,请求将以错误完成并且状态为0。0不是列在允许的HTTP状态代码中。
0的状态代码是什么意思?所有浏览器和所有HTTP客户端实用程序的含义是否相同?它是HTTP规范的一部分还是其他协议规范的一部分?这似乎意味着根本无法完成HTTP请求,可能是因为服务器地址无法解析。
哪些错误消息适合向用户显示? “要么您没有连接到互联网,要么网站遇到问题,或者地址中可能存在输入错误”?
我应该补充一点,当我设置为“脱机工作”时,我会看到FireFox中的行为,但是当设置为“脱机工作”时,我看不到Microsoft Internet Explorer中的行为。在IE中,用户获得一个对话框,提供上线选项。在返回错误之前,FireFox不会通知用户。
我问这是为了回应“显示更好的错误消息”的请求。 Internet Explorer的功能很好。它告诉用户导致问题的原因并为他们提供修复问题的选项。为了给FireFox提供一个等效的UX,我需要推断出问题的原因并通知用户。那么总共可以从状态0推断出什么呢?它是否具有普遍含义或者它什么都不告诉我?
答案 0 :(得分:141)
它的不是 HTTP响应代码,但 记录为W3作为{status
属性{}的有效值1}}(对于jQuery用户来说也是XMLHttpRequest
对象)。
它涵盖了一整套可能无法报告真实HTTP响应代码的情况,原因可能是您没有发送请求,您明确已中止,页面正在卸载,或者 x 因 x 的许多可能值之一而出错。
首先,重申:0 不是HTTP状态代码。在RFC 7231 Section 6.1中有一个完整的列表,但不包含0,第6节的介绍清楚地说明了
status-code元素是一个三位整数代码
其中0不是。
但是,记录了作为jqXHR
对象的status
属性值的0 。来自http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute的文档:
4.7.1状态属性
XMLHttpRequest
属性必须返回运行这些步骤的结果:
如果状态为UNSENT或OPENED,则返回0.
如果设置了错误标志,则返回0.
- 醇>
返回HTTP状态代码。
我们可以深入研究规范并找出返回0的条件是什么意思。来自http://www.w3.org/TR/XMLHttpRequest/#states:
4.5个州
...
status
(数值0)已经构建了对象。
UNSENT
(数值1)已成功调用
OPENED
方法。在此状态期间,可以使用open()
设置请求标头,并且可以使用setRequestHeader()
方法发出请求。...
错误标志表示某种类型的网络错误或获取终止。它最初未设置。
还需要注意send()
和UNSENT
之后的下一个可能状态是OPENED
:
HEADERS_RECEIVED
(数值2)已遵循所有重定向(如果有)并且已收到最终响应的所有HTTP标头。该对象的几个响应成员现在可用。
总而言之,简单的回答是,当没有真正的状态代码要返回时,0就是HEADERS_RECEIVED
对象的status
属性返回的内容,因为:
好的,但是哪些错误会导致这个神秘的错误标记"要设置?如果您按CTRL-F错误标记'在W3文档中,您会发现它在发送请求时会被取消设置,并且它只会将 set 作为算法的一部分来“终止请求& #34 ;.寻找 算法被调用的所有地方,你会发现它发生在:
XMLHttpRequest
方法open()
方法A'请求错误'发生以下情况时会发生以下情况:
发生网络错误,如果
,就会发生这种情况DNS错误,TLS协商失败或其他类型的网络错误
发生中止错误,只有在
时才会发生无论那意味着什么。我不知道任何浏览器在AJAX请求发生时向用户显示,并让他们有机会明确取消它们,所以我认为这个 - 至少在今天 - 是无关紧要的。最终用户取消请求
发生超时错误,这足以说明
timeout
不为0,因为请求已开始,abort()
指定的毫秒数已经过了
就timeout
而言,这就是一切。
超越XMLHttpRequest
,我推测JavaScript之外的语言中的HTTP库可能类似地使用0状态代码,当没有从服务器接收到状态代码时作为默认值。
答案 1 :(得分:52)
状态0。
此状态未记录,但存在于gadget.io的ajax和makeRequest调用中。
答案 2 :(得分:5)
表示请求在去往任何地方之前被取消
答案 3 :(得分:4)
知道这是一个老帖子。但这些问题仍然存在。
以下是我对该主题的一些发现,并进行了大量解释。
“状态”0表示3项内容之一,根据XMLHttpRequest规范:
dns名称解析失败(例如拔出网络插件时)
服务器没有回答(a.k.a。无法访问或无对应)
请求因CORS问题而中止(堕胎由用户代理执行,并且在飞行前OPTIONS失败)。
如果您想进一步深入了解XMLHttpRequest的内容。我建议读取就绪状态更新序列([0,1,2,3,4]是正常序列,[0,1,4]对应状态0,[0,1,2,4]表示没有内容发送可能是错误的)。您可能还希望将侦听器附加到xhr(onreadystatechange,onabort,onerror,ontimeout)以确定详细信息。
来自规范(XHR Living spec):
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;
答案 4 :(得分:0)
从iOS 9开始,您需要在info.plist文件中添加“App Transport Security Settings”,并在向非安全HTTP Web服务发出请求之前允许“允许任意加载”。我在我的一个应用程序中遇到了这个问题。
答案 5 :(得分:-1)
是的,ajax调用如何中止。原因可能如下。