159

当 JavaScript 网络调用(例如 fetch 或 XMLHttpRequest)或任何其他类型的 HTTP 网络请求失败并返回 HTTP 状态代码 0 时,这意味着什么?

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

我尝试完全拔掉网络作为测试。这可能是不相关的,但这导致了状态代码 17003 (IIRC),粗略的搜索表明这意味着“DNS 服务器查找失败”。

相同的代码在某些位置和系统上运行良好,但在某些环境中它会失败,状态代码为 0,并且没有提供 responseText。

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

4

15 回答 15

231

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

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

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

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

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

  1. 非法跨域请求(参见CORS
  2. 防火墙阻止或过滤
  3. 请求本身在代码中被取消
  4. 已安装的浏览器扩展程序搞砸了

对于浏览器来说,为更多这些 status==0 场景提供详细的错误报告会很有帮助。事实上,有时 status==0 会伴随一个有用的控制台消息,但在其他情况下没有其他信息。

于 2013-01-24T17:56:30.733 回答
65

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

于 2009-05-25T08:32:26.910 回答
35

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

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

于 2010-10-18T16:52:03.303 回答
15

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 和 XMLHttpRequest statusText = unknown可以帮助您。

于 2009-05-25T07:33:17.607 回答
10

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

这可能发生在超时、XHR 中止或防火墙踩踏请求。超时很常见,它意味着请求在指定时间内未能执行。XHR 中止操作非常简单……您实际上可以在 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()

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

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);
于 2012-09-13T17:45:08.357 回答
6

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

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

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

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

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

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

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

于 2009-05-26T21:29:27.233 回答
4

正如this answer on this page所详述,状态代码0表示请求由于某种原因失败,并且javascript库将失败解释为状态代码0。

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

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

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

于 2016-08-03T18:05:09.030 回答
2

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

于 2013-08-05T11:05:04.240 回答
2

我发现 status == 0 的一个新的且未记录的原因。这就是我所拥有的:

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

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

我可以在 state() 上找到很少的文档(Mozilla 没有列出它,W3C 有)并且没有一个提到“拒绝”。

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

于 2017-10-18T15:27:22.890 回答
1

在我的情况下,这是因为 AJAX 调用由于同源策略而被浏览器阻止。这是最意想不到的事情,因为我所有的 HTML 和脚本都是从127.0.0.1. 他们怎么能被认为具有不同的起源?

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

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

我删除了<base>我不需要的标签,现在它工作正常!

于 2013-01-27T17:48:39.003 回答
1

除了Lee 的回答之外,您还可以通过切换到同步请求来找到有关真正原因的更多信息,因为您还会遇到异常:

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

例如 :

NetworkError:发生网络错误。

于 2018-03-30T11:07:31.030 回答
0

万一其他人遇到这个问题,这会给我带来问题,因为 AJAX 请求和发送的普通表单请求。我用以下行解决了它:

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

那里的关键是 return false,这会导致表单不发送。您也可以只从 submitfunc() 内部返回 false,但我发现明确编写它会更清晰。

于 2012-09-07T20:36:45.370 回答
0

需要注意的是,超过client_max_body_sizenginx 指令的 ajax 文件上传会返回此错误代码。

于 2015-08-10T16:40:01.690 回答
0

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

于 2019-08-15T21:37:19.523 回答
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 请求的不同协议的情况,但我想这里介绍的诊断技术对于大多数用户来说更容易。

于 2019-09-16T17:47:05.540 回答