HTTP状态码0是否有任何意义?
看起来,当您在浏览器中通过脚本创buildXMLHttpRequest时,如果浏览器设置为离线工作或者拔出了networking电缆,则请求将完成,并显示错误状态= 0。0不在允许范围内列出HTTP状态码。
什么是0代表的状态码? 这是否意味着所有浏览器和所有HTTP客户端实用程序都是一样的? 它是HTTP规范的一部分,还是它是其他协议规范的一部分? 这似乎意味着HTTP请求根本无法完成,也许是因为服务器地址无法parsing。
什么错误信息适合向用户显示? “要么你没有连接到互联网,或者网站遇到问题,或者地址中可能有打字错误”?
我应该补充一点,我将FireFox中的行为设置为“脱机工作”,而不是在Microsoft Internet Explorer中设置为“脱机工作”时。 在IE中,用户得到一个对话框,让用户可以上网。 在返回错误之前,FireFox不会通知用户。
我是这样回答“显示更好的错误信息”的请求。 什么Internet Explorer做的很好。 它告诉用户是什么导致了问题,并给他们select修复它。 为了给与FireFox等价的用户体验,我需要推断问题的原因并通知用户。 那么从状态0可以推断出什么? 它有一个普遍的含义,还是没有告诉我什么?
简答
这不是一个HTTP响应代码,但它被 W3logging为XMLHttpRequest
的status
属性的有效值(因此jQuery用户也是一个jqXHR
对象)。
它涵盖了一大堆可能的情况,其中没有真正的HTTP响应代码可用于报告,或者是因为你没有发送请求,你明确地中止了它,页面正在卸载,或者x出错了许多可能的值之一的x 。
长答案
首先重申:0 不是 HTTP状态码。 在RFC 7231第6.1节中有一个完整的列表,它不包含0,第6节的介绍清楚地表明
状态码元素是一个三位整数码
其中0不是。
但是,将0logging为XMLHttpRequest
对象的status
属性的值。 来自http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute的文档:;
4.7.1状态属性
status
属性必须返回运行这些步骤的结果:
如果状态是UNSENT或OPENED,则返回0。
如果错误标志被设置,则返回0。
返回HTTP状态码。
我们可以深入挖掘规范,找出那些返回0的条件是什么意思。 从http://www.w3.org/TR/XMLHttpRequest/#states :
4.5个国家
…
UNSENT
(数值0)该对象已被构build。
OPENED
(数值1)
open()
方法已成功调用。 在此状态期间,可以使用setRequestHeader()
来设置请求标头,并且可以使用send()
方法进行请求。…
错误标志指示某种types的networking错误或提取终止。 它最初是未设置的。
注意UNSENT
和OPENED
之后的下一个可能的状态是HEADERS_RECEIVED
:
HEADERS_RECEIVED
(数值2)所有的redirect(如果有的话)都已经被遵守,并且最终响应的所有HTTP头已经被接收。 该对象的几个响应成员现在可用。
综合起来,最简单的答案就是,0不是真正的状态码返回时由XMLHttpRequest
对象的status
属性返回的值,因为:
- 该请求尚未发送,或
- 请求已经发送,但是响应的头还没有被接收,或者
- 在文档中列出的许多可能的情况之一已经导致了“错误标志”的设置。
好的,但是什么错误可以导致这个神秘的“错误标志”被设置? 如果您在W3文档中使用CTRL-F作为“错误标志”,则会发现在发送请求时它会被取消设置 ,并且只会被设置为algorithm的一部分,以“终止请求”。 寻找algorithm被调用的所有地方,你会发现它发生在:
- 该请求用
open()
方法打开(或重新打开) - 该请求被垃圾收集(例如,当离开页面时)
- 该请求用
abort()
方法abort()
-
发生“请求错误”,可能发生以下情况之一:
-
发生networking错误,如果发生这种情况
- 有一个无限的redirect循环
- 有/有
DNS错误,TLS协商失败或其他types的networking错误
- 该请求是一个CORS请求,并且不能共享响应
-
发生中止错误,只能发生
最终用户取消请求
无论如何。 我不知道有什么浏览器在AJAX请求发生时向用户显示,并让他们有机会明确地取消它们,所以我认为这至less在今天是无关紧要的。
-
发生超时错误,这意味着,相当合理,那
timeout
不是0,并且由于请求开始timeout
指定的毫秒数已经过去
-
就XMLHttpRequest
而言,这就是一切。
除了XMLHttpRequest
之外,我还会推测,JavaScript以外的语言的HTTP库可能会使用0状态代码,当没有从服务器接收到状态代码的时候,它就是默认值。
在通过刷新页面或请求无法访问的URL获取响应之前取消ajax调用时,状态为0。
这个状态没有被logging,但是存在于ajax和makegetquest中的来自gadget.io的makeRequest。
知道这是一个旧的职位。 但是这些问题依然存在。
这里是我对这个问题的一些发现,粗略地解释。
根据XMLHttpRequest规范,“状态”0表示3件事之一:
-
DNS名称parsing失败(例如当拔出networking插头时)
-
服务器没有回答(又名无法访问或无回应)
-
由于CORS问题,请求被中止(由用户代理执行堕胎,并且在OPTIONS pre-flight之后执行)。
如果你想进一步深入XMLHttpRequest的内部。 我build议读取就绪状态更新序列([0,1,2,3,4]是正常序列,[0,1,4]对应于状态0,[0,1,2,4]表示没有内容发送这可能是一个错误或不)。 您可能还想要将侦听器附加到xhr(onreadystatechange,onabort,onerror,ontimeout)以了解详细信息。
从规格( XHR生活规范 ):
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;
从iOS 9开始,您需要在您的info.plist文件中添加“App Transport Security Settings”,并在向非安全HTTP Web服务发出请求前允许“允许任意负载”。 我在我的一个应用程序中遇到了这个问题。
是的,一些如何阿贾克斯呼叫中止。 原因可能如下。
- 在完成ajax请求之前,用户导航到其他页面。
- Ajax请求超时。
- 服务器无法返回任何响应。