ajax返回状态码为零,ajax - HTTP请求返回状态码0时的含义是什么?

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

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

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

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

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

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

13个解决方案

153 votes

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

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

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

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

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

非法交叉来源请求(请参阅CORS)

防火墙阻止或过滤

请求本身已在代码中取消

已安装的浏览器扩展程序正在解决问题

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

whitneyland answered 2019-07-29T10:11:49Z

45 votes

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

Nick answered 2019-07-29T10:10:22Z

33 votes

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

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

Cory R. King answered 2019-07-29T10:12:20Z

13 votes

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

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

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

Christophe Eblé answered 2019-07-29T10:12:58Z

6 votes

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

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

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

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

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

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

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

mike nelson answered 2019-07-29T10:14:04Z

4 votes

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

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

jQuery: error(jqXHR, textStatus, errorThrown);

Zepto: error(xhr, errorType, error);

Cory Danielson answered 2019-07-29T10:14:52Z

2 votes

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

fellowworldcitizen answered 2019-07-29T10:15:17Z

2 votes

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

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

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

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

Brad Parks answered 2019-07-29T10:16:05Z

1 votes

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

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

我删除了标签,顺便说一句我不需要它,现在它工作正常!

Saintali answered 2019-07-29T10:16:43Z

1 votes

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

function request(url) {

var request = new XMLHttpRequest();

try {

request.open('GET', url, false);

request.send(null);

} catch (e) {

console.log(url + ': ' + e);

}

}

例如 :

NetworkError:发生网络错误。

McX answered 2019-07-29T10:17:19Z

0 votes

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

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

samoz answered 2019-07-29T10:17:51Z

0 votes

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

r3wt answered 2019-07-29T10:18:16Z

0 votes

我找到了一个新的,没有记录的状态== 0的原因。这就是我所拥有的:

XMLHttpRequest.status === 0

XMLHttpRequest.readyState === 0

XMLHttpRequest.responseText === ''

XMLHttpRequest.state() === 'rejected'

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

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

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

Jonathan Amend answered 2019-07-29T10:19:02Z

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值