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

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

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

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

  3. 返回HTTP状态代码.

我们可以深入研究规范并找出返回0的条件意味着什么.来自http://www.w3.org/TR/XMLHttpRequest/#states:

4.5个国家

...

UNSENT (数值0)

该对象已经构建.

OPENED (数值1)

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

...

错误标志指示某种类型的网络错误或fetch终止.它最初未设置.

这也是必要指出,下一个可能的状态之后UNSENT,并OPENEDHEADERS_RECEIVED:

HEADERS_RECEIVED (数值2)

已遵循所有重定向(如果有)并且已收到最终响应的所有HTTP标头.现在可以使用该对象的几个响应成员.

把这一切放在一起,简短的回答是0就是当没有真正的状态代码返回时,对象的status属性XMLHttpRequest返回的内容,因为:

  • 请求尚未发送,或
  • 请求已发送,但尚未收到响应的标头,或
  • 文档中列出的许多可能情况之一已导致设置"错误标志".

好的,但是什么错误会导致这个神秘的"错误标志"被设置?如果您在W3文档中使用CTRL-F表示'错误标志',您会发现它在发送请求时未设置,并且它只被设置为算法的一部分以"终止请求".寻找所有的地方在于算法被调用时,你会发现,当它发生:

  • 使用该open()方法打开(或重新打开)请求
  • 请求被垃圾收集(例如,当离开页面时)
  • 使用该abort()方法中止请求
  • 发生"请求错误",当发生以下某种情况时,可能会发生这种情况:

    • 发生网络错误,如果发生,则可能发生

      • 有一个无限的重定向循环
      • 有/

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

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

      最终用户取消请求

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

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

      timeout不是0并且因为请求开始timeout已经过了指定的毫秒数

就目前XMLHttpRequest而言,这就是一切.

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


mnk*_*mnk 53

在通过刷新页面或请求无法访问的URL获取响应之前取消ajax调用时,将显示状态0.

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

  • 我的逻辑是 - 如果(状态<400) - >"好去" (5认同)
  • 您好,有没有办法区分失败("无网络")和取消请求? (4认同)
  • 此状态记录为XmlHttpRequest状态.当然它不是一个http状态,但它有记录.http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute有关详细信息,请参阅Mark Amery回复. (2认同)

Lok*_*oki 5

来自文档http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute 表示请求在去任何地方之前被取消

  • 这是列出的一些可能含义之一. (3认同)

Obo*_*tor 5

知道这是一个旧帖子。但是这些问题仍然存在。

以下是我对这个主题的一些发现,粗略地解释了。

根据 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)