代码之家  ›  专栏  ›  技术社区  ›  mike nelson

当HTTP请求返回状态代码0时,这意味着什么?

  •  91
  • mike nelson  · 技术社区  · 16 年前

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

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

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

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

    这是一个典型的HTTP发布到Internet URL。它不涉及文件:/,据我所知,该文件可能返回0,表示在Firefox中成功。

    13 回复  |  直到 6 年前
        1
  •  45
  •   Nick    16 年前

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

        2
  •  141
  •   whitneyland    8 年前

    这里的许多答案都是错误的。 似乎人们知道在他们的特定情况下导致status==0的原因,然后将其归纳为答案。

    实际上,失败的xmlhttpRequest的状态==0应被视为未定义的错误。

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

    从规范(fetch或xmlhttprequest)可以看到,此代码可能是在联系服务器之前发生的错误的结果。

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

    1. 非法的跨来源请求(请参见 CORS )
    2. 防火墙阻止或过滤
    3. 请求本身已在代码中取消
    4. 一个已安装的浏览器扩展正在把事情搞得一团糟。

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

        3
  •  32
  •   Cory R. King    14 年前

    根据浏览器的不同,基于jQuery的Ajax调用将使用HTTP状态代码0调用Success回调。我们发现状态代码“0”通常意味着用户在Ajax调用完成之前导航到另一个页面。

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

        4
  •  13
  •   Peter Mortensen icecrime    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
    

    对于状态代码“0”,您是要在运行在Web服务器上的本地网页上还是不运行Web服务器上执行请求?

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

        5
  •  6
  •   mike nelson    16 年前

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

    我们认为这与防火墙问题有关,所以我们想出了解决办法。如果有人有同样的问题,我们就这样做了:

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

    2. 当用户单击“将数据发送回服务器”时,HTA会读取数据并写出一个HTML页面,其中包含一个XML数据岛(实际上使用的是脚本语言=XML脚本块)。

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

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

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

        6
  •  4
  •   Community CDub    8 年前

    HTTP响应代码0表示取消了Ajax请求。

    这可能发生在超时、XHR中止或防火墙对请求的践踏中。超时很常见,这意味着请求在指定时间内执行失败。xhr流产很简单…实际上,可以在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在中止时将为“abort”,在超时时将为“timeout”。如果您使用的是zepto(非常类似于jquery),那么错误类型在中止时为“错误”,在超时时为“超时”。

    jQuery: error(jqXHR, textStatus, errorThrown);
    Zepto:  error(xhr, errorType, error);
    
        7
  •  2
  •   fellowworldcitizen    11 年前

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

        8
  •  2
  •   doptimusprime    7 年前

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

    要测试这一点,您可以执行以下任一操作:

    1)使用此镀铬延长件, Requestly 从中重定向URL https 您的URL版本 http 版本,因为这将导致混合内容安全错误,并最终生成状态代码0。这种方法的优点是,你根本不需要更改你的应用程序,你可以使用这个扩展名简单地“重写”你的URL。

    2)更改应用程序的代码,使终结点重定向到 HTTP协议 URL的版本,而不是 HTTPS 版本(反之亦然)。如果这样做,请求将失败,状态代码为0。

        9
  •  1
  •   Saintali    12 年前

    在我的例子中,这是因为浏览器阻止了Ajax调用,因为 同一原产地政策 . 这是最不被期待的事情,因为我所有的HTMLS和脚本都是从 127.0.0.1 . 他们怎么能被认为有不同的起源呢?

    不管怎样,根本原因是一个无辜的人 <base> 标签:

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

    我删除了 <基地& GT; 标签,顺便说一下,我不需要它,现在它工作得很好!

        10
  •  1
  •   McX    7 年前

    除了 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);
        }
    }
    

    例如:

    网络错误:发生网络错误。

        11
  •  0
  •   foobarfuzzbizz    12 年前

    如果其他人遇到这个问题,这就给了我一些问题,因为Ajax请求和一个正常的表单请求被发送。我用下面的一行解决了它:

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

    这里的键是返回false,这会导致表单不发送。您也可以从submitFnc()内部返回false,但我发现显式地编写它更清晰。

        12
  •  0
  •   r3wt    9 年前

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

        13
  •  0
  •   Jonathan Amend    7 年前

    我发现了一个新的未记录的状态原因==0。以下是我的经历:

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

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

    我在state()上几乎找不到文档(mozilla没有列出,w3c没有),而且没有提到“拒绝”。

    原来是我的 广告拦截器 (在火狐上发布源代码)。