XMLHttpRequest状态0(responseText为空)

时间:2011-02-15 15:54:53

标签: javascript ajax xmlhttprequest

无法使用XMLHttpRequest获取数据(状态0和responseText为空):

xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","http://www.w3schools.com/XML/cd_catalog.xml", true);
xmlhttp.onreadystatechange=function() 
{
  if(xmlhttp.readyState==4)
    alert("status " + 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)

使用在线请求会导致问题(状态= 0)的原因是什么?

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

  HTTP/1.1 200 OK
  Content-Length: 4742

PS2:VMWare上的Apache本地Web服务器(主机操作系统Win7,访客操作系统Ubuntu,网络适配器 - NAT)。浏览器 - Firefox。

20 个答案:

答案 0 :(得分:39)

当您在浏览器中通过文件方案打开包含脚本的html文件时,

状态为0。确保将文件放在服务器中(无论是apache还是tomcat),然后在浏览器中通过http协议打开它。 (即http://localhost/myfile.html)这是解决方案。

答案 1 :(得分:26)

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

如果您正在进行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对象添加了跨域功能,但我还没有玩过这些功能。

答案 2 :(得分:25)

实际上确保你的按钮类型是按钮未提交,这导致我最近遇到的状态冲突。

答案 3 :(得分:16)

如果服务器响应OPTIONS方法并且使用标题来响应GET和POST(无论你使用哪个):

Access-Control-Allow-Origin: *

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

答案 4 :(得分:9)

还要考虑请求超时

现代浏览器返回 readyState = 4 并且s tatus = 0 如果在服务器响应之前经过了太多时间。

答案 5 :(得分:6)

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

答案 6 :(得分:3)

我遇到过类似的问题。每件事都没关系,“readystate”是4,但“status”是0.这是因为我使用的是Apache PHP便携式服务器,而我使用“XMLHttpRequest”对象的文件是一个html文件。我将文件扩展名更改为php,问题解决了。

答案 7 :(得分:3)

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

答案 8 :(得分:2)

回答http://127.0.0.1/cd_catalog.xml为何有效的问题 http://localhost/cd_catalog.xml不会:Firefox将127.0.0.1和localhost视为两个不同的域。

答案 9 :(得分:1)

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

您必须添加HTTP响应标头:

Access-Control-Allow-Origin: *

如果你这样做,结果不仅可以起作用,而且还会起作用。

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

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

答案 10 :(得分:1)

要查看问题是什么,当您得到神秘错误0时,请转到... |。更多工具| Chrome中的开发者工具(Ctrl + Shift + I)(在显示错误的页面上)

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

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

我已经有:

Access-Control-Allow-Origin: *

但不是:

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

在我的Web服务的响应标头中。

添加完这些内容后,错误零从我自己的Web服务器消失了,以及在没有Web服务器的情况下在本地运行index.html文件时,但仍然出现了代码笔错误。

返回... |更多工具|开发人员工具在出现Codepen中的错误的同时,也有明确的解释:Codepen使用https,因此我无法调用http,因为安全性较低。

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

知道如何获取真正的错误消息-无价!

答案 11 :(得分:1)

此处的另一个案例是status === 0,特定于上传:

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

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

到目前为止,我只在Chrome OSX上对此进行了测试,因此我不确定这里有多少问题是MDN的文档以及Chrome的实施情况。

答案 12 :(得分:0)

浏览器请求“127.0.0.1/somefile.html”未更改地到达本地Web服务器,而“localhost / somefile.html”可能以“0:0:0:0:0:0:0:1/1”的形式到达somefile.html“如果支持IPv6。 因此后者可以被处理为从域到另一个域。

答案 13 :(得分:0)

Alex Robinson和bmju提供了有价值的信息来理解跨源问题。我想补充一点,在进行所需的GET / POST之前,您可能需要在客户端代码中进行显式的OPTIONS调用(例如,针对CORS OAuth服务端点)。您的浏览器/库可能无法自动处理OPTIONS请求。格鲁伯,这是你问题的可能答案之一。

答案 14 :(得分:0)

我有同样的问题(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);
   });
 });

答案 15 :(得分:0)

通过检查我的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补丁。谢谢那个人。

答案 16 :(得分:0)

我不得不(再次)将我的当前IP地址添加到Atlas MongoDB whitelist,因此摆脱了XMLHttpRequest状态0错误

答案 17 :(得分:0)

我只是遇到了这个问题,因为我使用0.0.0.0作为服务器,将其更改为localhost,并且可以正常工作。

答案 18 :(得分:0)

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

答案 19 :(得分:-2)

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

您无法进行跨域XMLHttpRequests。

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

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

您可以改为考虑:

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

希望有所帮助