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

时间:2010-09-29 20:28:26

标签: ajax http browser xmlhttprequest

当您从浏览器中的脚本创建XMLHttpRequest时,如果浏览器设置为脱机工作或拔出网络电缆,请求将以错误完成并且状态为0。0不是列在允许的HTTP状态代码中。

0的状态代码是什么意思?所有浏览器和所有HTTP客户端实用程序的含义是否相同?它是HTTP规范的一部分还是其他协议规范的一部分?这似乎意味着根本无法完成HTTP请求,可能是因为服务器地址无法解析。

哪些错误消息适合向用户显示? “要么您没有连接到互联网,要么网站遇到问题,或者地址中可能存在输入错误”?

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

我问这是为了回应“显示更好的错误消息”的请求。 Internet Explorer的功能很好。它告诉用户导致问题的原因并为他们提供修复问题的选项。为了给FireFox提供一个等效的UX,我需要推断出问题的原因并通知用户。那么总共可以从状态0推断出什么呢?它是否具有普遍含义或者它什么都不告诉我?

6 个答案:

答案 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属性必须返回运行这些步骤的结果:

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

  2.   
  3. 如果设置了错误标志,则返回0.

  4.   
  5. 返回HTTP状态代码。

  6.   

我们可以深入研究规范并找出返回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属性返回的内容,因为:

  • 请求尚未发送,或
  • 请求已发送,但尚未收到回复标题,或
  • the docs中列出的导致"错误标记的许多可能情况之一"待定。

好的,但是哪些错误会导致这个神秘的错误标记"要设置?如果您按CTRL-F错误标记'在W3文档中,您会发现它在发送请求时会被取消设置,并且它只会将 set 作为算法的一部分来“终止请求& #34 ;.寻找 算法被调用的所有地方,你会发现它发生在:

  • 使用XMLHttpRequest方法
  • 打开(或重新打开)请求
  • 请求被垃圾收集(例如,当离开页面时)
  • 请求已使用open()方法
  • 中止
  • A'请求错误'发生以下情况时会发生以下情况:

    • 发生网络错误,如果

      ,就会发生这种情况
      • 有一个无限重定向循环
      • 有/有
          

        DNS错误,TLS协商失败或其他类型的网络错误

      • 请求是CORS请求,无法共享响应
    • 发生中止错误,只有在

      时才会发生
        

      最终用户取消请求

      无论那意味着什么。我不知道任何浏览器在AJAX请求发生时向用户显示,并让他们有机会明确取消它们,所以我认为这个 - 至少在今天 - 是无关紧要的。

    • 发生超时错误,这足以说明

        

      timeout不为0,因为请求已开始,abort()指定的毫秒数已经过了

timeout而言,这就是一切。

超越XMLHttpRequest,我推测JavaScript之外的语言中的HTTP库可能类似地使用0状态代码,当没有从服务器接收到状态代码时作为默认值。

答案 1 :(得分:52)

在通过刷新页面或请求无法访问的URL获取响应之前取消ajax调用时,会出现

状态0。

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

答案 2 :(得分:5)

来自文档http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute

表示请求在去往任何地方之前被取消

答案 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调用如何中止。原因可能如下。

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