关于ajax:HTTP请求返回状态码0是什么意思? |
您所在的位置:网站首页 › ajax状态码为0的具体原因百度百科 › 关于ajax:HTTP请求返回状态码0是什么意思? |
当JavaScript网络调用(例如fetch或XMLHttpRequest或任何其他类型的HTTP网络请求)失败且HTTP状态代码为0时,这是什么意思? 这似乎不是有效的HTTP状态代码,因为其他代码是HTTP规范中的三位数字。 我尝试完全拔掉网络作为测试。 它可能不相关,但是导致状态代码17003(IIRC),粗略搜索表明" DNS服务器查找失败"。 相同的代码在某些位置和系统上可以正常工作,但是在某些环境中,它会失败,并且状态码为0,并且没有提供responseText。 这是到Internet URL的典型HTTP POST。 它不涉及file://,据我所知可能会返回0,表示在Firefox中成功。 相关讨论 可能是由于防火墙造成的吗? 您的客户端在哪个操作系统上运行该应用程序? " ...但是规格含糊不清..."-对不起? 关于greenbytes.de/tech/webdav/rfc2616.html#rfc.section.6.1.1有什么含糊之处? 是的,这并不模糊,不确定我在读什么,我会改变的! 可能有用:stackoverflow.com/a/12622082/386579 相关文章-HTTP状态码0是什么意思 Ive在Firefox中遇到了相同的问题,发现广告拦截器插件阻止了对包含单词banner的URL的所有请求这里的许多答案都是错误的。似乎人们找出了在特定情况下导致status == 0的原因,然后将其概括为答案。 实际上,将失败的XmlHttpRequest的status == 0视为未定义的错误。 实际的W3C规范定义了在此处返回零的条件: https://fetch.spec.whatwg.org/#concept-network-error 从规范(fetch或XmlHttpRequest)中可以看到,该代码可能是由于甚至在联系服务器之前发生的错误的结果。 产生此状态码的一些常见情况在其他答案中有所反映,但可能是以下任何一个或没有这些问题: 非法的跨源请求(请参阅CORS) 防火墙阻止或过滤 该请求本身已在代码中被取消 已安装的浏览器扩展程序正在搞砸对于浏览器而言,为这些status == 0场景中的更多场景提供详细的错误报告将是有帮助的。实际上,有时status == 0会伴随有用的控制台消息,但在其他消息中则没有其他信息。 相关讨论 Firefox插件NoScript可以取消对不受信任的主机的XHR请求。 +?1,这都是准确的,"发生某种错误"是实际的解释。对于那些对规范给出的可能原因的完整列表感兴趣的人,我已在stackoverflow.com/a/26451773/1709587上发布了细分。 马克·阿默里(Mark Amery)详细介绍的引起我最大麻烦的案件是cors案件。如果错误导致响应通过cors验证失败,您将获得0状态而不是http状态,因为当cors验证失败时,无法访问响应。尝试检测正在维护的Web api并响应503时尤其令人沮丧。如果此api在维护过程中不遵守cors,则您将无法检测到503,您将只能得到0,这可能是由许多其他原因引起的东西。 我面临的CORS问题:如果您的页面最初是通过http加载的,则考虑使用http而不是https,反之亦然。如果您的页面最初是通过https访问的,则换句话说,您的页面不会通过https执行ajax POST;如果您的页面最初是通过https访问的,则不会通过http执行ajax POST。 W3C链接可能应该更新:fetch.spec.whatwg.org/#concept-network-error。我知道fetch而不是xhr,但这是xhr规范链接到fetch的"网络错误"说明。 我认为您是正确的@Paul Murray,Ive取消了链接。谢谢。 同步请求在0状态时抛出更有意义的异常:stackoverflow.com/a/49573256/1192811 是的,这是我的CORS问题。之后注意到,Firefox控制台中还引发了一条警告消息:跨域请求被阻止:同源策略禁止读取[url]处的远程资源。 (原因:CORS标头" Access-Control-Allow-Origin"缺失)。 这是迄今为止到目前为止我所看到的任何内容所没有的帮助。 花了我半天时间才能发现,如果URL包含单词banner,则Firefox插件" uBlock起源"会阻止AJAX调用。 当基本身份验证在预检选项请求中导致401时,就会出现此CORS问题我相信错误代码表明响应为空,(甚至没有返回标头)。这表示已接受连接,然后正常关闭(TCP FIN)。 造成这种情况的原因有很多,但是根据您的描述,某种形式的防火墙似乎是最有可能的罪魁祸首。 相关讨论 我想你可能是对的。 (尽管,正如@sleepycod指出的那样,在没有实际的http状态代码的情况下,wininet.dll可能会返回一些状态代码。) 这不一定是正确的。我有同样的问题,但就我而言,从未发送过请求。原因是Firefox广告拦截器阻止了URL包含单词banner的请求。值得一看的是,取决于浏览器,基于jQuery的AJAX调用将使用HTTP状态代码0调用您的成功回调。我们发现状态代码" 0"通常意味着用户之前会导航到另一个页面AJAX调用完成。 与您使用的技术堆栈不同,但是希望对某些人有用。 相关讨论 是的,由于该页面已获得10,000次浏览,因此人们可能会遇到很多问题。 还是应该说25,000次观看? 这是很有价值的:这正是我的自动化测试中错误的地方。非常感谢! 反对不是因为这是"正确的"答案,而是我的情况。 确实确实会发生这种情况,但这不是您将看到错误代码== 0的唯一原因。您不能仅假设用户正在浏览它,因此不能过滤出此类错误消息。wininet.dll返回下面列出的标准和非标准状态代码。 12345678910401 - 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和XMLHttpRequest statusText = unknown可以为您提供帮助。 相关讨论 感谢您的代码。不,这不是本地请求,它是从本地运行的vbscript对Internet上的Web服务器的请求。解决方法:我们最终要做的是 我们认为这与防火墙问题有关,因此我们想出了解决该问题的方法。如果有人遇到同样的问题,请执行以下操作: 我们仍然像以前一样使用HTA将数据写入本地硬盘上的文本文件中。 当用户单击"将数据发送回服务器"时,HTA读取数据并写出包含该数据的HTML页面作为XML数据岛(实际上使用SCRIPT LANGUAGE = XML脚本块)。 HTA在浏览器中启动指向HTML页面的链接。 HTML页面现在包含将数据发布到服务器(使用Microsoft.XMLHTTP)的javascript。 希望这对有类似要求的人有所帮助。在这种情况下,它是在展会上用在笔记本电脑上的Flash游戏。我们永远都无法使用笔记本电脑,只能将其通过电子邮件发送给客户,因为这次贸易展览是在另一个国家进行的。 相关讨论 嗨,我正在调查生产中的客户正在发生的类似问题。您说的问题是由防火墙引起的。您是否还记得防火墙造成的影响是什么,或者防火墙为此做了什么?HTTP响应代码0表示AJAX请求已取消。 这可能是由于超时,XHR中止或防火墙对请求的踩踏而发生的。超时很常见,这意味着请求无法在指定时间内执行。 XHR Abortion的操作非常简单...实际上,您可以在XMLHttpRequest对象上调用.abort()来取消AJAX调用。 (如果您不希望AJAX调用返回并尝试引用已销毁的对象,那么这对于单页应用程序来说是一个好习惯。)如标记答案中所述,防火墙也可以取消请求并触发此请求0响应。 XHR Abort:使用jQuery中止Ajax请求 1234567891011var 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将在中止时为"错误",在发生超时时为"超时"。 12jQuery: error(jqXHR, textStatus, errorThrown); Zepto: error(xhr, errorType, error);如本页上的答案所详述,状态代码为0表示请求由于某种原因而失败,而JavaScript库将失败解释为状态代码为0。 要对此进行测试,您可以执行以下任一操作: 1)使用此chrome扩展程序,请求将您的网址从url的https版本重定向到http版本,因为这将导致混合内容安全性错误,并最终生成状态代码0。这种方法是您根本不必更改应用程序,而您可以使用此扩展名简单地"重写"您的网址。 2)更改应用程序的代码,以选择使端点重定向到URL的http版本而不是https版本(反之亦然)。如果执行此操作,则请求将失败,状态码为0。 相关讨论 "使用此chrome扩展程序" — chrome扩展程序?在HTA应用程序中? 肯定的一点! 但是大多数到达这里的人都没有来到这里申请HTA。 他们使用谷歌搜索" javascript http状态代码0"或类似内容,然后到达此处-因此,我认为,这个问题的HTA部分总体上意义不大,最终仍然有意义。以我为例,当我忘记将WWW放在我的域之前时,状态变为0。由于我所有的ajax请求都被硬编码为http:/WWW.mydomain.com,而加载的网页仅为http://mydomain.com,因此由于其域不同而成为安全问题。我最终在.htaccess文件中进行了重定向,以始终将www放在前面。 除了Lee的答案,您还可以通过切换到同步请求来找到有关真正原因的更多信息,因为您还会得到一个例外: 123456789function request(url) { var request = new XMLHttpRequest(); try { request.open('GET', url, false); request.send(null); } catch (e) { console.log(url + ': ' + e); } }例如 : NetworkError: A network error occurred. 我发现了状态== 0的新的且未公开的原因。这是我的经历: 1234XMLHttpRequest.status === 0 XMLHttpRequest.readyState === 0 XMLHttpRequest.responseText === '' XMLHttpRequest.state() === 'rejected'它不是跨域,不是网络的,也不是由于取消的请求(通过代码或用户导航)引起的。开发者控制台或网络日志中没有任何内容。 我几乎找不到关于state()的文档(Mozilla未列出它,W3C列出了它),并且都没有提到"被拒绝"。 原来是我的广告拦截器(在Firefox上为uBlock Origin)。 就我而言,这是因为AJAX调用由于同源策略而被浏览器阻止。这是最不值得期待的事情,因为我的所有HTML和脚本都从127.0.0.1提供。如何认为它们有不同的来历? 无论如何,根本原因是看起来很纯真的标签: 1我删除了我不需要的标记,现在它可以正常工作了! 以我为例,该错误发生在使用HTTP协议请求的页面中,并且其中的Javascript试图发出HTTPS请求。 反之亦然。 页面加载后,按F12(或Ctrl + U)并查看页面的HTML代码。 如果您在代码中看到类似的内容: 1234 var ajaxurl ="https://example.com/wp-admin/admin-ajax.php"; (...)您的网页是通过以下方式请求的: http://example.com/example-page/2019/09/13/my-post/#elf_l1_Lw 您当然会遇到此错误。 要解决此问题,请将Javascript请求的协议设置为与页面请求的协议相同。 之前在Brad Parks的答案中提到了涉及针对页面和js请求的不同协议的情况,但是我想这里介绍的诊断技术对于大多数用户来说更容易。 如果要在本地PC上进行测试,它将无法正常工作。要测试Ajax示例,您需要将HTML文件放置在Web服务器上。 应该注意的是,超过nginx的client_max_body_size指令的ajax文件上传将返回此错误代码。 万一其他人遇到此问题,由于发送了AJAX请求和正常表单请求,这给了我一些问题。我用以下行解决了它: 1关键是返回false,这导致表单无法发送。您也可以从submitfunc()内部返回false,但是我发现显式地将其编写得更清楚。 相关讨论 防止默认值也适用于此。它是一个JavaScript函数,可防止浏览器在事件发生期间执行默认行为,从而使您可以巧妙地覆盖/阻止本机功能... return false也会做同样的事情。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |