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为XMLHttpRequeststatus属性的有效值(因此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属性必须返回运行这些步骤的结果:

  1. 如果状态是UNSENT或OPENED,则返回0。

  2. 如果错误标志被设置,则返回0。

  3. 返回HTTP状态码。

我们可以深入挖掘规范,找出那些返回0的条件是什么意思。 从http://www.w3.org/TR/XMLHttpRequest/#states

4.5个国家

UNSENT (数值0)

该对象已被构build。

OPENED (数值1)

open()方法已成功调用。 在此状态期间,可以使用setRequestHeader()来设置请求标头,并且可以使用send()方法进行请求。

错误标志指示某种types的networking错误或提取终止。 它最初是未设置的。

注意UNSENTOPENED之后的下一个可能的状态是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服务发出请求前允许“允许任意负载”。 我在我的一个应用程序中遇到了这个问题。

是的,一些如何阿贾克斯呼叫中止。 原因可能如下。

  1. 在完成ajax请求之前,用户导航到其他页面。
  2. Ajax请求超时。
  3. 服务器无法返回任何响应。