XMLHttpRequest状态0(responseText为空)

ari*_*asa 94 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服务器(主机OS Win7,Guest OS Ubuntu,网络适配器 - NAT).浏览器 - Firefox.

小智 46

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

  • 我在Safari Version 6.1.6上成功获得状态== 0. (3认同)

小智 29

您遇到问题的原因是您尝试进行跨域调用并且失败.

如果您正在进行localhost开发,您可以进行跨域调用 - 我会一直这样做.

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

signed.applets.codebase_principal_support = true
Run Code Online (Sandbox Code Playgroud)

然后在XHR开放代码中添加这样的内容:

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }
Run Code Online (Sandbox Code Playgroud)

对于IE,如果我没记错的话,您只需在"其他→跨域访问数据源"下启用浏览器的安全设置,即可使用ActiveX XHR.

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

  • 如果有人需要它,对于Chrome,您需要启动它的新实例(没有任何已经打开)并使用`--allow-file-access-from-files` (8认同)

小智 25

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


Ale*_*son 18

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

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

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

  • 这是正确的答案!请访问http://en.wikipedia.org/wiki/Cross-origin_resource_sharing了解更多信息.如果你添加这个标题,那就不是"可能有效",但"会起作用".注意您需要添加的是HTTP /响应/标头 - 因此您只能在您控制的服务器上执行此操作.永远不可能使用`XMLHttpRequest`直接获取http://www.w3schools.com/XML/cd_catalog.xml(即根据原始问题),因为该资源没有(至少截至2015年4月24日) )包括任何此类CORS标头. (3认同)

小智 10

还要考虑请求超时:

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

  • @AndreaSavojardo:关于这种行为是否符合标准,您是否有任何参考资料(例如 MDN 上的帖子)? (3认同)

小智 6

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


Gab*_*ger -4

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

您不能执行跨域 XMLHttpRequest。

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

另外两个测试失败是因为 JavaScript 无法通过 XMLHttpRequest 与远程服务器通信。

您可以考虑:

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

希望有帮助

  • 这是错误的。您*可以*执行跨域 XMLHttpRequest。 (40认同)
  • -- 很公平,但我不知道评论是否是最好的论坛。跨域 XMLHttpRequest 当然存在一些安全挑战,但它们提供了应对这些挑战所需的所有工具。除此之外,它们还允许网站轻松地向其他网站提供服务、使用 CDN 传播数据并更快地响应用户请求。如果您有任何具体问题,可以给我留言,或者更好的是,在 SO 上发布问题并引起我的注意。 (24认同)
  • @GabrielSprenger:跨域“XMLHttpRequest”不仅是一个**好**的想法,而且现在很常见,不在现代网络应用程序中执行它们(除了某种HelloWorlds)是很荒谬的。您的应用程序使用的任何外部 REST 服务都需要跨域“XMLHttpRequest”。这就是添加所有 CORS 内容的原因。 (2认同)