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

时间:2009-05-16 11:11:45

标签: 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中成功。

15 个答案:

答案 0 :(得分:153)

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

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

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

从spec(fetch或XmlHttpRequest)可以看出,这段代码可能是在联系服务器之前发生错误的结果。

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

  1. 非法交叉来源请求(请参阅CORS
  2. 防火墙阻止或过滤
  3. 请求本身已在代码中取消
  4. 已安装的浏览器扩展程序正在搞乱
  5. 对于浏览器来说,为更多这些状态== 0场景提供详细的错误报告会有所帮助。实际上,有时status == 0会伴随有用的控制台消息,但在其他情况下则没有其他信息。

答案 1 :(得分:47)

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

答案 2 :(得分:34)

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

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

答案 3 :(得分:13)

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

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

如果您没有在网络服务器上运行脚本,

XMLHttpRequest status = 0 and XMLHttpRequest statusText = unknown 可以为您提供帮助。

答案 4 :(得分:6)

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

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

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

  2. 当用户点击“将数据发送回服务器”时,HTA会读取数据并写出一个HTML页面,其中包含该数据作为XML数据岛(实际上使用SCRIPT LANGUAGE = XML脚本块)

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

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

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

答案 5 :(得分:4)

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

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

XHR中止:Abort Ajax requests using jQuery

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()

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

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);

答案 6 :(得分:2)

在我的情况下,当我忘记将WWW放在我的域前时,状态变为0。因为我的所有ajax请求都是硬编码的http:/WWW.mydomain.com,并且加载的网页只是http://mydomain.com,因此它成为一个安全问题,因为它是一个不同的域。我最终在我的.htaccess文件中进行了重定向,以便始终将www放在前面。

答案 7 :(得分:2)

详细by this answer on this page,状态代码为0表示请求因某种原因失败,javascript库将失败解释为状态代码0。

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

1)使用此Chrome扩展程序Requestly将您的网址从您的网址的https版本重定向到http版本,因为这会导致混合内容安全性错误,并且最终生成一个0的状态​​代码。这种方法的优点是你根本不必更改你的应用程序,你可以简单地重写"您使用此扩展程序的网址。

2)更改应用代码,以便有选择地使您的端点重定向到您的网址的http版本,而不是https版本(反之亦然)。如果执行此操作,请求将失败,状态码为0。

答案 8 :(得分:1)

就我而言,这是因为浏览器阻止了AJAX调用,因为同源策略。这是最不期望的事情,因为我的所有HTML和脚本都是从127.0.0.1提供的。他们怎么可能被认为有不同的起源?

无论如何,根本原因是一个看似无辜的<base>标签:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

我删除了<base>标记,顺便说一下,我不需要它,现在它正常工作!

答案 9 :(得分:1)

我发现状态== 0的新原因和未记录的原因。这就是我所拥有的:

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

它不是跨域,网络或由于取消请求(通过代码或用户导航)。开发人员控制台或网络日志中没有任何内容。

我可以找到关于state()的很少文档(Mozilla没有列出它,W3C没有列出),也没有提到“被拒绝”。

原来是我的广告拦截器(Firefox上的uBlock Origin)。

答案 10 :(得分:1)

除了Lee's answer之外,您还可以通过切换到synchronous请求找到有关真正原因的更多信息,因为您还会遇到异常:

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

例如:

  

NetworkError:发生网络错误。

答案 11 :(得分:0)

如果有其他人遇到此问题,由于AJAX请求和正常的表单请求被发送,这给了我问题。我用以下一行解决了这个问题:

<form onsubmit="submitfunc(); return false;">

键是返回false,导致表单不发送。您也可以从submitfunc()内部返回false,但我发现明确地将其写为更清楚。

答案 12 :(得分:0)

应该注意的是,超过nginx的client_max_body_size指令的ajax文件上传将返回此错误代码。

答案 13 :(得分:0)

如果要在本地PC上进行测试,它将无法正常工作。要测试Ajax示例,您需要将HTML文件放置在Web服务器上。

答案 14 :(得分:0)

在我的情况下,该错误发生在使用HTTP协议请求的页面中,并且其中的Javascript试图发出HTTPS请求。反之亦然。

页面加载后,按F12键(或Ctrl + U),然后查看页面的HTML代码。如果您在代码中看到类似的内容:

<!-- javascript request inside the page -->
<script>
var ajaxurl = "https://example.com/wp-admin/admin-ajax.php";
(...)
</script>

您的网页是通过以下方式请求的:

  

http://example.com/example-page/2019/09/13/my-post/#elf_l1_Lw

您肯定会遇到此错误。

要解决此问题,请将Javascript请求的协议设置为与页面请求的协议相同。

以前,在 Brad Parks 的答案中提到了涉及针对页面和js请求的不同协议的情况,但是,我想这里介绍的诊断技术对于大多数用户来说更容易。 / p>