这似乎不是有效的 HTTP 状态码,因为在 HTTP 规范中其他状态码通常有三个数字。
我尝试完全断开网络作为测试。可能与此无关,但结果显示状态码为 17003(如果我没记错),初步搜索表明这意味着“DNS 服务器查找失败”。
相同的代码在某些位置和系统上运行良好,但在某些环境中会以状态码 0 失败,并且没有提供 responseText。
这是向互联网 URL 发送的典型 HTTP POST 请求。它不涉及 file://,在 Firefox 中返回 0 表示成功,这是我理解的。
这里很多答案是错误的。 看起来人们找出了导致其特定情况下状态为0的原因,然后将其概括为答案。
实际上,对于失败的XmlHttpRequest而言,status==0应被视为未定义的错误。
实际W3C规范定义了返回零的条件: https://fetch.spec.whatwg.org/#concept-network-error
从规范可以看出(fetch或XmlHttpRequest),此代码可能是在与服务器联系之前发生的错误的结果。
产生此状态代码的一些常见情况反映在其他答案中,但也可能是这些问题中的任何一个或没有:
有帮助的是,浏览器能够为更多的status==0场景提供详细的错误报告。确实,有时status==0会伴随着一个有用的控制台信息,但在其他情况下却没有其他信息。
http
加载,请考虑改用http
而不是https
,反之亦然。换句话说,如果您的页面通过http
访问,请不要通过https
执行ajax POST
,如果您的页面最初通过https
访问,则不要通过http
执行ajax POST
。 - Victor Ponamarev我认为该错误代码表明响应为空(即没有返回头)。这意味着连接已被接受,然后优雅地关闭(TCP FIN)。 有很多原因可能会导致这种情况,但根据您的描述,某种形式的防火墙似乎是最有可能的罪魁祸首。
就其价值而言,根据浏览器的不同,基于jQuery的AJAX调用将以HTTP状态码0调用成功回调函数。我们发现,“0”状态码通常意味着用户在AJAX调用完成之前导航到了其他页面。
虽然技术栈与您使用的不同,但希望对某些人有用。
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服务器上的本地网页上进行请求,还是在没有web服务器的情况下进行请求?
XMLHttpRequest status = 0 and XMLHttpRequest statusText = unknown可以帮助您在未在web服务器上运行脚本时进行调试。
HTTP响应码为0表示AJAX请求被取消。
这可能是由于超时、XHR中止或防火墙阻止请求。超时是常见的,它意味着请求未能在指定时间内执行。XHR中止非常简单...您实际上可以在XMLHttpRequest对象上调用.abort()来取消AJAX调用。(如果您不希望AJAX调用返回并尝试引用已被销毁的对象,则对于单页面应用程序,这是一个好的实践。)如标记答案中所述,防火墙也能够取消请求并触发此0响应。
XHR中止:使用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()方法也会触发error回调。如果您正在进行任何解析这些对象的错误处理操作,则会很快注意到,已中止的XHR和超时的XHR是相同的,但是使用jQuery时传递给error回调的textStatus将在中止时为"abort",在超时发生时为"timeout"。如果您使用Zepto(与jQuery非常相似),则在中止时errorType将为"error",在超时发生时为"timeout"。
jQuery: error(jqXHR, textStatus, errorThrown);
Zepto: error(xhr, errorType, error);
我们仍然像以前一样使用HTA将数据写入本地硬盘上的文本文件中。
当用户单击“将数据发送回服务器”时,HTA会读取数据并编写一个包含该数据作为XML数据岛的HTML页面(实际上使用SCRIPT LANGUAGE=XML脚本块)。
HTA在浏览器中启动HTML页面的链接。
现在,HTML页面包含将数据发布到服务器的JavaScript(使用Microsoft.XMLHTTP)。
我发现了一个新的、未记录的 status == 0 的原因。以下是我的发现:
XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'
这不是跨域、网络或由于代码或用户导航取消的请求所致。开发者控制台或网络日志中没有任何信息。
我在state()上找到的文档很少(Mozilla没有列出,W3C也没有),其中没有提到“rejected”。
事实证明是我的广告拦截器(Firefox上的uBlock Origin)引起的。