【问题标题】:XMLHttpRequest status 0 (responseText is empty)XMLHttpRequest 状态 0(responseText 为空)
【发布时间】:2011-06-27 17:13:24
【问题描述】:

无法通过 XMLHttpRequest 获取数据(状态 0 且 responseText 为空):

xmlhttp=新的 XMLHttpRequest(); xmlhttp.open("GET","http://www.w3schools.com/XML/cd_catalog.xml", true); xmlhttp.onreadystatechange=函数() { 如果(xmlhttp.readyState==4) 警报(“状态” + xmlhttp.status); } xmlhttp.send();

它会提醒“状态 0”。

与localhost请求相同的情况(cd_catalog.xml保存为本地文件)

xmlhttp.open("GET","http://localhost/cd_catalog.xml", true);

但是使用 localhost IP 请求

xmlhttp.open("GET","http://127.0.0.1/cd_catalog.xml", true);

并与本地文件请求

xmlhttp.open("GET","cd_catalog.xml", true);

一切正常(状态 200)

在线请求出现问题 (status=0) 的原因是什么?

PS:Live HTTP Headers 显示在所有 4 种情况下一切正常:

HTTP/1.1 200 正常 内容长度:4742

PS2:VMWare 上的 Apache 本地 Web 服务器(主机操作系统 Win7、来宾操作系统 Ubuntu、网络适配器 – NAT)。浏览器 – 火狐。

【问题讨论】:

  • 你的测试页面是否在http://127.0.0.1 ? ;)
  • 是的。 <a href="/default/index/tourl?u=aHR0cDovLzEyNy4wLjAuMS9DRENhdGFsb2dUZXN0Lmh0bWw%3D" rel="nofollow" target="_blank">127.0.0.1/CDCatalogTest.html</a>
  • 你回答了你的问题。 XMLHttpRequest 不能做跨域请求。不过有一些解决方法。以 jquery 为例。
  • 使用php获取文件。小解决方法:jquery-howto.blogspot.com/2009/04/…
  • @meze:跨域调用可以使用 jQuery。但是,由于 jQuery 是在 JavaScript 中实现的,它怎么能不能与普通的 JavaScript 一起工作呢?对我来说完全是无稽之谈。 jQuery 是否使用了某种讨厌的解决方法?

标签: javascript ajax xmlhttprequest


【解决方案1】:

当我尝试使用 XMLHttpRequest 在烧瓶环境中由 python 创建的一些 Web 方法时,我遇到了同样的问题。 检查firefox控制台后,我意识到问题的原因是同源策略,它阻止调用不同ORIGIN的web方法(一个源由3部分组成,包括:协议、域和端口号)。 对我来说,解决方案是使用CORS,幸运的是我使用了一个名为flask-cors 的python 包,一切正常。

【讨论】:

    【解决方案2】:

    python 中的瓶子应用程序:

    @route('/mazer2/get', method='POST')
    def GetMaze2():
        if MazeCore == None: abort(666, "MazeCore поломался :///")
        Check()
        Comm = request.body.read().decode("utf-8")
        Map = MazeCore.GetMaze2(Comm, TestToken2())
        response.headers["Access-Control-Allow-Origin"] = "*" #Here ;'-} It helped me
        return Map
    

    【讨论】:

      【解决方案3】:

      我刚刚遇到这个问题,因为我使用0.0.0.0 作为我的服务器,将其更改为localhost 并且它可以工作。

      【讨论】:

        【解决方案4】:

        我必须(再次)将我当前的 IP 地址添加到 Atlas MongoDB whitelist,从而摆脱 XMLHttpRequest 状态 0 错误

        【讨论】:

          【解决方案5】:

          要查看问题所在,当您收到神秘错误 0 时,请转到 ... |更多工具 | Chrome 中的开发人员工具 (Ctrl+Shift+I)(在给出错误的页面上)

          阅读日志中的红色文本以获取真正的错误消息。如果那里有太多,请右键单击并清除控制台,然后再次执行您的最后一个请求。

          我的第一个问题是,我第一次将授权标头传递给我自己的浏览器跨域 Web 服务。

          我已经有了:

          Access-Control-Allow-Origin: *
          

          但不是:

          Access-Control-Allow-Methods: GET, POST, PUT, DELETE
          Access-Control-Allow-Headers: Authorization
          

          在我的网络服务的响应头中。

          添加之后,我的错误零从我自己的网络服务器中消失了,以及在没有网络服务器的情况下在本地运行 index.html 文件时,但仍然在代码笔中给出错误。

          返回... |更多工具 |开发者工具在codepen中得到错误,并且有明确的解释:codepen使用https,所以我不能调用http,因为安全性较低。

          因此,我需要在 https 上托管我的网络服务。

          知道如何获得真正的错误信息 - 无价之宝!

          【讨论】:

          • 我使用了这种方法(chrome 中的 f12),并发现我试图从 https 转到 http,但它在没有提供任何有用的信息的情况下默默地失败了。 错误消息:VM1152:1 混合内容:'https://mysiteoriginsite' 处的页面通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点 'http://MyDestinationSite/MyService.svc'。此请求已被阻止;内容必须通过 HTTPS 提供。
          【解决方案6】:

          当您通过文件方案在浏览器中打开包含脚本的 html 文件时,状态为 0。确保将文件放在您的服务器(apache 或 tomcat 等)中,然后在浏览器中通过 http 协议打开它。 (即http://localhost/myfile.html)这就是解决方案。

          【讨论】:

          • 为什么这被否决了?这是真的!来自 file:// 的文件的 URL 的 XHR 请求也在 file:// URL 上实际上具有状态 == 0 成功(在 FF 24.0.5 上测试)。
          • 我在 Safari 版本 6.1.6 上也获得了 status == 0。
          • 我的状态=0(但网络上的状态为 200)在 firefox 上使用 加载临时插件
          • 仍然有效。实际远程方案(http 等)的 HTTP 响应为 200,本地文件(file:// 方案)的响应为 0。显然,您需要首先通过禁用 CORS 来允许本地文件加载。
          • @DanielRoethlisberger 仅供参考,您的答案不再建立
          【解决方案7】:

          打开 javascript 控制台。您将在那里看到一条错误消息。就我而言,它是 CORS。

          【讨论】:

            【解决方案8】:

            还要考虑请求超时

            如果服务器响应时间过长,现代浏览器会返回 readyState=4 和 status=0

            【讨论】:

            • @AndreaSavojardo:对于这种行为是否符合标准,您有任何参考(例如 MDN 上的帖子)吗?
            • @AndreaSavojardo 我有 readyState=4 和 status=0 并且服务器没有运行,但是错误的警报很快就显示给我......“请求超时”需要多长时间?跨度>
            • 你在说什么。 ReadyState=4 表示完成,文档说得很清楚developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
            【解决方案9】:

            我遇到了同样的问题(readyState 为 4,状态为 0),然后我采用了本教程中解释的不同方法: https://spring.io/guides/gs/consuming-rest-jquery/

            他根本没有使用XMLHttpRequest,而是使用了jquery $.ajax()方法:

            <head>
                <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
                <script src="hello.js"></script>
            </head>
            
            <body>
                <div>
                    <p class="greeting-id">The ID is </p>
                    <p class="greeting-content">The content is </p>
                </div>
            </body>
            

            对于 public/hello.js 文件(或者您可以直接将其插入到相同的 HTML 代码中):

            $(document).ready(function() 
             {
                $.ajax({
                    url: "http://rest-service.guides.spring.io/greeting"
               }).then(function(data) {
                  $('.greeting-id').append(data.id);
                  $('.greeting-content').append(data.content);
               });
             });
            

            【讨论】:

            • 您确实意识到 jQuery $.ajax() 在内部使用 XMLHttpRequest,不是吗?
            【解决方案10】:

            如果服务器响应 OPTIONS 方法以及 GET 和 POST(无论您使用的是哪一个),其标题如下:

            Access-Control-Allow-Origin: *
            

            它可能工作正常。似乎在 FireFox 3.5 和 rekonq 0.4.0 中。 显然,使用该标头和对 OPTIONS 的初始响应,服务器对浏览器说:“继续,让这个跨域请求通过。”

            【讨论】:

            • 这是正确答案!查看en.wikipedia.org/wiki/Cross-origin_resource_sharing 了解更多信息。如果您添加此标题,它不是“可能工作”,而是“将工作”。注意您需要添加的是 HTTP /response/ 标头 - 因此您只能在您控制的服务器上执行此操作。永远不可能使用XMLHttpRequest 直接获取w3schools.com/XML/cd_catalog.xml(即根据原始问题),因为该资源(至少,截至 2015 年 4 月 24 日)不包含任何此类 CORS 标头。
            【解决方案11】:

            问题的原因是您尝试进行跨域调用但失败

            如果你在做 localhost 开发,你可以进行跨域调用——我一直都在做。

            对于 Firefox,您必须在配置设置中启用它

            signed.applets.codebase_principal_support = true
            

            然后将类似这样的内容添加到您的 XHR 开放代码中:

              if (isLocalHost()){
                if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
                  netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
                }
              }
            

            对于 IE,如果我没记错的话,您所要做的就是在“其他 → 跨域访问数据源”下启用浏览器的安全设置,以使其与 ActiveX XHR 一起使用。

            IE8 及更高版本还为原生 XmlHttpRequest 对象添加了跨域功能,但我还没有玩过。

            【讨论】:

            • 如果有人需要它,对于 Chrome,您需要启动它的新实例(没有任何已经打开)并使用 --allow-file-access-from-files
            • @TheZ:你是 100% 的吗?我听说您只需要使用--allow-file-access-from-files 开关运行新的 Chrome 实例,但您不必关闭所有其他正在运行的实例。与 Chrome 隐身模式 完全一样——您可以使用它,而无需关闭任何其他正在运行的实例。
            • 似乎已放弃对“UniversalBrowserRead”的支持,因此无法解决此问题。
            • 另外,当您从 https 页面请求 http 页面(如浏览器内扩展)时,可能会发生这种情况。
            • 我遇到了这个问题,尽管 html 页面和 AJAX 脚本位于同一个域中。但奇怪的是,它只影响 一些 脚本,尤其是任何访问 MongoDB 资源的脚本。关于这是为什么的任何线索?
            【解决方案12】:

            Alex Robinson 和 bmju 为了解跨域问题提供了宝贵的信息。我想补充一点,在进行所需的 GET/POST 之前,您可能需要在客户端代码中进行显式 OPTIONS 调用(例如,针对 CORS OAuth 服务端点)。您的浏览器/库可能不会自动处理 OPTIONS 请求。 Gruber,这是您问题的可能答案之一。

            【讨论】:

              【解决方案13】:

              浏览器请求“127.0.0.1/somefile.html”原封不动地到达本地网络服务器,而“localhost/somefile.html”可能以“0:0:0:0:0:0:0:1/”的形式到达somefile.html" 如果支持 IPv6。 所以后者可以被处理为从一个域到另一个域。

              【讨论】:

                【解决方案14】:

                Alex Robinson 已经(并且首先)给出了这个问题的正确答案。但要详细说明...

                您必须添加 HTTP 响应标头:

                Access-Control-Allow-Origin: *

                如果你这样做,结果不仅仅是“可能有效”,而是“会有效”。

                NB 您需要添加的是 HTTP response 标头 - 因此您只能在您控制的服务器上执行此操作。永远不可能使用XMLHttpRequest(根据 OP 的问题)直接从其原始 URL 获取http://w3schools.com/XML/cd_catalog.xml,因为该资源不(至少,截至 2015 年 4 月 24 日)不包含任何此类 CORS 标头。

                http://en.wikipedia.org/wiki/Cross-origin_resource_sharing 提供更多信息。

                【讨论】:

                  【解决方案15】:

                  这是另一种情况,其中status === 0,特定于上传:

                  如果您将'load' 事件处理程序附加到XHR.upload,作为suggested by MDN(向下滚动到“监控进度”的上传部分),XHR 对象将具有status=0,所有其他属性将为空字符串。如果您将 'load' 处理程序直接附加到 XHR 对象,就像下载内容时一样,您应该没问题(假设您没有在本地主机上运行)。

                  但是,如果您想在 'progress' 事件处理程序中获得良好的数据,则需要将处理程序附加到 XHR.upload直接附加到 XHR 对象本身。

                  到目前为止,我只在 Chrome OSX 上测试过这个,所以我不确定这里有多少问题是 MDN 的文档以及 Chrome 的实现有多少......

                  【讨论】:

                    【解决方案16】:

                    setRequestHeader("Access-Control-Allow-Origin","*") 添加到您的服务器响应中。

                    【讨论】:

                      【解决方案17】:

                      编辑:请阅读下面 Malvolio 的 cmets,因为此答案的知识已过时。

                      你不能做跨域的 XMLHttpRequests。

                      127.0.0.1 的调用有效,因为您的测试页位于127.0.0.1,并且本地测试也有效,因为,嗯...这是本地测试。

                      其他两个测试失败,因为 JavaScript 无法通过 XMLHttpRequest 与远程服务器通信。

                      您也可以考虑:

                      • XMLHttp-请求您自己的服务器为您获取远程 XML 内容(例如 php 脚本)
                      • 如果您想保持完整的 JavaScript,请尝试使用 GoogleAppEngine 等服务。

                      希望有帮助

                      【讨论】:

                      • 这是错误的。你可以做跨域的 XMLHttpRequests。
                      • “你不能”如“你不应该这样做,因为这绝不是一个好主意”
                      • -- 很公平,但我不知道评论是否是 最好的 论坛。跨域 XMLHttpRequest 确实存在一些安全挑战,但它们提供了应对这些挑战所需的所有工具。除此之外,它们还允许网站轻松地向其他网站提供服务,使用 CDN 传播数据,并更快地响应用户请求。如果您有任何具体问题,可以给我发消息,或者更好的是,在 SO 上发布问题并引起我的注意。
                      • @GabrielSprenger: 跨域XMLHttpRequests 不仅是一个的想法,而且现在非常普遍,以至于不在现代网络应用程序中执行它们(除了某种HelloWorlds) 是荒谬的。您的应用使用的任何外部 REST 服务都需要跨域 XMLHttpRequest。这就是添加所有 CORS 内容的原因。
                      【解决方案18】:

                      通过检查我的 html 代码解决了与此类似的问题。我的表单提交按钮中有一个onclick 处理程序。像这样:onclick="sendFalconRequestWithHeaders()"。这个方法反过来调用 ajax 就像你的一样,做我想做的事。但与预期不同,我的浏览器没有返回任何内容。

                      someone's hardwork 学习,我在这个处理程序中返回了 false,并解决了。 让我提一下,在到达这篇文章之前,我花了整整 3 天的周末和半天的时间在办公室编写代码实现 CORS filtersjetty config,其他 jersey and embedded jetty 相关的东西 - 只是为了解决这个问题。,旋转我对cross domain ajax requests 和标准的所有理解。 javascript 中的简单错误让你变得愚蠢,这太荒谬了。

                      说实话,我试过signed.applets.codebase_principal_support = true 并写了isLocalHost() **if**。可能这个方法需要我们自己实现,firefox说没有这个 现在我必须清理我的代码才能干净地提交 git 补丁。感谢那个人。

                      【讨论】:

                        【解决方案19】:

                        回答为什么http://127.0.0.1/cd_catalog.xml 起作用的问题 http://localhost/cd_catalog.xml 没有:Firefox 将 127.0.0.1 和 localhost 视为两个不同的域。

                        【讨论】:

                          【解决方案20】:

                          其实要确保你的按钮类型是Button not Submit,这导致了我最近遇到的状态冲突。

                          【讨论】:

                          • 存在冲突,因为提交表单有一些默认行为,如果您正在处理事件并自己进行 ajax 调用,则需要防止这些行为。您可以通过在处理程序中获取事件并调用 e.preventDefault() 来防止默认行为
                          【解决方案21】:

                          我也遇到过类似的问题。一切正常,“就绪状态”为 4,但“状态”为 0。这是因为我使用的是 Apache PHP 便携式服务器,而我使用“XMLHttpRequest”对象的文件是一个 html 文件。我把文件扩展名改成php,问题就解决了。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2014-02-04
                            • 2014-05-28
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2013-01-18
                            相关资源
                            最近更新 更多