HTTP请求返回状态码0时的含义是什么?

mik*_*son 115 ajax http xmlhttprequest httpresponse fetch-api

JavaScript网络调用(例如fetch或XMLHttpRequest)或任何其他类型的HTTP网络请求在HTTP状态代码为0时失败是什么意思?

这似乎不是有效的HTTP状态代码,因为其他代码在HTTP规范中是三位数.

我尝试完全拔掉网络作为测试.它可能是不相关的,但导致状态代码17003(IIRC),粗略搜索建议意味着"DNS服务器查找失败".

相同的代码可以在某些位置和系统中正常工作,但在某些环境中,它会因状态代码0而失败,并且没有提供responseText.

这是Internet URL的典型HTTP POST.它不涉及file://我理解可能会返回0表示在Firefox中成功.

whi*_*and 178

这里的许多答案都是错误的. 似乎人们在他们的特定情况下弄清楚导致状态== 0的原因然后将其概括为答案.

实际上,对于失败的XmlHttpRequest,status == 0应被视为未定义的错误.

实际的W3C规范定义了这里返回零的条件:https: //fetch.spec.whatwg.org/#concept-network-error

正如您从spec(fetch或XmlHttpRequest)中看到的那样,此代码可能是在联系服务器之前发生错误的结果.

产生此状态代码的一些常见情况会反映在其他答案中,但可能是这些问题中的任何一个或没有:

  1. 非法交叉来源请求(请参阅CORS)
  2. 防火墙阻止或过滤
  3. 请求本身已在代码中取消
  4. 已安装的浏览器扩展程序正在解决问题

有用的是浏览器为更多这些状态== 0场景提供详细的错误报告.实际上,有时status == 0会伴随有用的控制台消息,但在其他情况下则没有其他信息.

  • + 1,这一切都是准确的,"发生某种错误"是实际的解释.对于对规范给出的可能原因的综合列表感兴趣的人,我在http://stackoverflow.com/a/26451773/1709587上发布了一个细分. (5认同)
  • Firefox插件NoScript可以取消对不受信任的主机的XHR请求. (4认同)

Nic*_*ick 51

我相信错误代码表明响应是空的(因为甚至没有返回标题).这意味着连接已被接受,然后正常关闭(TCP FIN).有许多事情可能导致这种情况,但根据您的描述,某种形式的防火墙似乎是最可能的罪魁祸首.

  • 我想你可能是对的.(虽然正如@sleepycod指出的那样,wininet.dll会在没有_real_ http状态代码的情况下返回一些状态代码.) (2认同)

Cor*_*ing 34

对于它的价值,取决于浏览器,基于jQuery的AJAX调用将使用HTTP状态代码0调用您的成功回调.我们发现状态代码为"0"通常意味着用户之前导航到不同的页面AJAX调用已完成.

与您使用的技术堆栈不同,但希望对某些人有用.

  • 值得一提的是:这正是我的自动化测试中失误的原因.非常感谢! (3认同)

Chr*_*blé 14

wininet.dll 返回下面列出的标准和非标准状态代码.

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception
Run Code Online (Sandbox Code Playgroud)

对于状态代码"零",您是在网络服务器上运行的本地网页上还是在没有网络服务器的情况下尝试进行请求?

如果您没有在Web服务器上运行脚本, XMLHttpRequest status = 0和XMLHttpRequest statusText = unknown可以帮助您.


Cor*_*son 10

HTTP 响应代码 0 表示 AJAX 请求已取消。

这可能是由于超时、XHR 中止或防火墙对请求的踩踏而发生的。超时很常见,这意味着请求未能在指定时间内执行。XHR Abortion 的操作非常简单……您实际上可以在 XMLHttpRequest 对象上调用 .abort() 来取消 AJAX 调用。(如果您不希望 AJAX 调用返回并尝试引用已销毁的对象,这对于单页应用程序来说是一种很好的做法。)如标记答案中所述,防火墙也能够取消请求并触发此操作0 响应。

XHR Abort:使用 jQuery 中止 Ajax 请求

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()
Run Code Online (Sandbox Code Playgroud)

值得注意的是,在 XHR 对象上运行 .abort() 方法也会触发错误回调。如果您正在执行解析这些对象的任何类型的错误处理,您会很快注意到中止的 XHR 和超时的 XHR 是相同的,但是对于 jQuery,传递给错误回调的 textStatus 将在中止时“中止”和“超时”发生超时。如果您使用 Zepto(与 jQuery 非常相似),则中止时 errorType 为“error”,超时时为“timeout”。

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);
Run Code Online (Sandbox Code Playgroud)


mik*_*son 6

解决方法:我们最终做了什么

我们认为它与防火墙问题有关,因此我们想出了一个可以解决问题的解决方法.如果有人有这个相同的问题,这就是我们做的:

  1. 我们仍然像以前一样使用HTA将数据写入本地硬盘上的文本文件.

  2. 当用户单击"将数据发送回服务器"时,HTA读入数据并写出包含该数据的HTML页面作为XML数据岛(实际上使用SCRIPT LANGUAGE = XML脚本块).

  3. HTA在浏览器中启动指向HTML页面的链接.

  4. HTML页面现在包含将数据发布到服务器的javascript(使用Microsoft.XMLHTTP).

希望这可以帮助任何有类似要求的人.在这种情况下,它是在笔记本电脑上用于贸易展的Flash游戏.我们从来没有使用笔记本电脑,只能通过电子邮件发送给客户,因为此次贸易展是在另一个国家进行的.


Bra*_*rks 5

正如本页上的这个答案所详述的,状态代码 0 表示请求由于某种原因失败,并且 javascript 库将失败解释为状态代码 0。

要对此进行测试,您可以执行以下任一操作:

1)使用这个chrome扩展,Requestly将你的url从https你的url的版本重定向到该http版本,因为这会导致混合内容安全错误,并最终生成状态代码0。这种方法的优点是你不根本不必更改您的应用程序,您只需使用此扩展程序“重写”您的网址即可。

2) 更改应用程序的代码,以选择性地使端点重定向到httpurl 的版本而不是https版本(反之亦然)。如果这样做,请求将失败,状态代码为 0。

  • 当然是好点!但大多数来到这里的人并不是为了申请 HTA。他们正在谷歌搜索“javascript http status code 0”或类似的东西,然后到达这里 - 所以我认为这个问题的 HTA 部分总体来说是最不重要的,最终这仍然是相关的。 (4认同)