Mar*_*ton 89 browser ajax http xmlhttprequest
看来,当您从浏览器中的脚本创建XMLHttpRequest时,如果浏览器设置为脱机工作或者拔出网络电缆,请求将以错误完成并且状态为0. 0未列为允许HTTP状态代码.
状态代码0是什么意思?所有浏览器和所有HTTP客户端实用程序的含义是否相同?它是HTTP规范的一部分还是其他协议规范的一部分?这似乎意味着根本无法进行HTTP请求,可能是因为服务器地址无法解析.
显示用户的错误消息是什么?"要么您没有连接到互联网,要么网站遇到问题,或者地址中可能存在输入错误"?
我应该补充一点,当我设置为"脱机工作"时,我会看到FireFox中的行为,但是当设置为"脱机工作"时,我看不到Microsoft Internet Explorer中的行为.在IE中,用户获得一个对话框,提供上线选项.FireFox在返回错误之前不会通知用户.
我问这是为了回应"显示更好的错误消息"的请求.Internet Explorer的功能很好.它告诉用户导致问题的原因并为他们提供修复问题的选项.为了给FireFox提供一个等效的UX,我需要推断出问题的原因并通知用户.那么总共可以从状态0推断出什么呢?它有普遍意义还是什么都没告诉我?
Mar*_*ery 147
这不是一个HTTP响应代码,但它是由W3记录为有效的值的status
的属性XMLHttpRequest
(因此也是一个的jqXHR
对象,jQuery的用户).
它涵盖了一整套可能的情况,其中没有可用于报告的真实HTTP响应代码,或者是因为您没有发送请求,您明确地中止了它,页面正在卸载,或者x出错了许多可能的值之一的X.
首先,重申:0 不是 HTTP状态代码.RFC 7231第6.1节中有完整的列表,不包括0,第6节的介绍清楚地表明
status-code元素是一个三位整数代码
哪个0不是.
然而,0作为一个所述的值status
的属性XMLHttpRequest
的对象被记录.来自http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute的文档:
4.7.1 status属性
该
status
属性必须返回运行这些步骤的结果:
如果状态为UNSENT或OPENED,则返回0.
如果设置了错误标志,则返回0.
返回HTTP状态代码.
我们可以深入研究规范并找出返回0的条件意味着什么.来自http://www.w3.org/TR/XMLHttpRequest/#states:
4.5个国家
...
UNSENT
(数值0)该对象已经构建.
OPENED
(数值1)该
open()
方法已成功调用.在此状态期间,可以使用请求标头设置,setRequestHeader()
并且可以使用该send()
方法进行请求....
的错误标志指示某种类型的网络错误或fetch终止.它最初未设置.
这也是必要指出,下一个可能的状态之后UNSENT
,并OPENED
是HEADERS_RECEIVED
:
HEADERS_RECEIVED
(数值2)已遵循所有重定向(如果有)并且已收到最终响应的所有HTTP标头.现在可以使用该对象的几个响应成员.
把这一切放在一起,简短的回答是0就是当没有真正的状态代码返回时,对象的status
属性XMLHttpRequest
返回的内容,因为:
好的,但是什么错误会导致这个神秘的"错误标志"被设置?如果您在W3文档中使用CTRL-F表示'错误标志',您会发现它在发送请求时未设置,并且它只被设置为算法的一部分以"终止请求".寻找所有的地方在于算法被调用时,你会发现,当它发生:
open()
方法打开(或重新打开)请求abort()
方法中止请求发生"请求错误",当发生以下某种情况时,可能会发生这种情况:
发生网络错误,如果发生,则可能发生
DNS错误,TLS协商失败或其他类型的网络错误
发生中止错误,只有在发生时才会发生
最终用户取消请求
不管它是什么意思.我不知道任何在AJAX请求发生时向用户显示的浏览器,并让他们有机会明确地取消它们,所以我认为这个 - 至少在今天 - 是无关紧要的.
发生超时错误,这足以说明这一点
timeout
不是0并且因为请求开始timeout
已经过了指定的毫秒数
就目前XMLHttpRequest
而言,这就是一切.
除此之外XMLHttpRequest
,我推测JavaScript之外的语言中的HTTP库可能类似地使用0状态代码,当没有从服务器接收到状态代码时作为默认值.
mnk*_*mnk 53
在通过刷新页面或请求无法访问的URL获取响应之前取消ajax调用时,将显示状态0.
此状态未记录,但存在于gadget.io的ajax和makeRequest调用中.
知道这是一个旧帖子。但是这些问题仍然存在。
以下是我对这个主题的一些发现,粗略地解释了。
根据 XMLHttpRequest 规范,“Status” 0 表示以下三种情况之一:
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;
Run Code Online (Sandbox Code Playgroud)