XMLHttpRequest状态0(responseText为空)

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

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

它提醒“状态0”。

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

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

但与本地主机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显示,在所有情况下,一切正常:

   HTTP / 1.1 200 OK
  内容长度:4742

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

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

您的问题的原因是, 您正在尝试进行跨域调用,并失败

如果您正在进行本地主机开发,则可以进行跨域调用 – 我一直都在进行。

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

 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对象添加了跨域function,但我还没有玩过这些。

其实确保你的buttontypes是button不提交,导致我最近遇到的状态冲突。

如果服务器响应一个OPTIONS方法,并且对GET和POST(无论他们使用什么)响应一个头如:

 Access-Control-Allow-Origin: * 

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

考虑请求超时

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

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

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

要回答为什么http://127.0.0.1/cd_catalog.xml工作而http://localhost/cd_catalog.xml不工作的问题:Firefox将127.0.0.1和localhost视为两个不同的域。

编辑:请阅读下面的Malvolio的评论,因为这个答案的知识已经过时了。

你不能做跨域XMLHttpRequests。

127.0.0.1的调用是127.0.0.1因为你的testing页面位于127.0.0.1 ,本地testing也可以工作,呃…这是一个本地testing。

另外两个testing失败,因为JavaScript不能通过XMLHttpRequest与远处的服务器进行通信。

您可以考虑以下两种方法

  • XMLHttp – 请求您自己的服务器为您提取远程XML内容(例如,PHP脚本)
  • 试图使用像GoogleAppEngine这样的服务,如果你想保持JavaScript的完整。

希望有所帮助

Alex Robinson已经(和第一个)给出了这个问题的正确答案。 但要详细说明一下…

您必须添加HTTP响应标头:

Access-Control-Allow-Origin: *

如果你这样做,结果不只是“可能工作”,而是“将工作”。

注意你需要添加一个HTTP 响应头 – 所以你只能在你控制的服务器上这样做。 永远不可能使用XMLHttpRequest (根据OP的问题)从原始URL直接获取http://w3schools.com/XML/cd_catalog.xml ,因为该资源没有(至less不是2015年4月24日)包括任何这样的CORS标题。

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

我的问题类似于这个解决了检查我的HTML代码。 我在表单提交button的方法中有一个onclick处理程序。 像这样: onclick="sendFalconRequestWithHeaders()" 。 这个方法又会像你一样调用ajax,并且做我想要的。 但不是预期的那样,我的浏览器什么也没有返回。

从某人的辛勤工作中学习,我已经在这个处理程序中回了假,并且解决了。 让我提一下,在到达这个职位之前,我已经花了整整3天的时间在周末半天在办公室编写实现CORS filtersjetty config ,其他jersey and embedded jetty相关的代码 – 只是为了解决这个问题。我对cross domain ajax requests和标准的理解。 在javascript中简单的错误让你愚蠢是荒谬的。

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

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

如果按照MDN的build议 (向下滚动到“监视进度”的上传部分)将'load'事件处理程序附加到XHR.upload ,则XHR对象的status=0 ,所有其他属性将为空string。 如果直接将'load'处理程序附加到XHR对象,就像下载内容时那样,您应该没问题(因为您没有运行本地主机)。

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

我只在Chrome OSX上testing过这个,所以我不确定这个问题有多less是MDN的文档,Chrome是多less…

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

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

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