XMLHttpRequest 状态 0(响应文本为空)

IT技术 javascript ajax xmlhttprequest
2021-01-23 06:18:39

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

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

它提醒“状态 0”。

与localhost请求相同的情况(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 显示在所有 4 种情况下一切正常:

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

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

6个回答

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

我也在 Safari 版本 6.1.6 上成功获得 status == 0。
2021-03-24 06:18:39
为什么这会被低估?这是真的!来自 file:// 文件的 URLs 的 XHR 请求也在 file:// URLs 上实际上具有 status == 0 成功(在 FF 24.0.5 上测试)。
2021-04-01 06:18:39
仍然有效的答案。HTTP 响应对于实际远程方案(http 等)为 200,对于本地文件(file://方案)为 0 显然,您需要先通过禁用 CORS 来允许本地文件加载。
2021-04-03 06:18:39
在 firefox使用加载临时加载项的状态=0(但网络状态为 200)
2021-04-05 06:18:39

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

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

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

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

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

存在冲突,因为提交表单有一些默认行为,如果您正在处理事件并自己进行 ajax 调用,则需要防止这些行为。您可以通过在处理程序中获取事件并调用来防止默认行为e.preventDefault()
2021-03-18 06:18:39

如果服务器响应 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/ 标头 - 因此您只能在您控制的服务器上执行此操作。永远不可能使用(即根据原始问题)直接获取w3schools.com/XML/cd_catalog.xmlXMLHttpRequest,因为该资源不(至少截至 2015 年 4 月 24 日)不包含任何此类 CORS 标头。
2021-03-28 06:18:39

还要考虑请求超时

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

你在说什么。ReadyState=4 表示完成,文档说得很清楚developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/...
2021-03-27 06:18:39
@AndreaSavojardo 我有 readyState=4 和 status=0 并且服务器没有运行但是错误的警报显示我很快......“请求超时”经过了多少时间?
2021-04-06 06:18:39
@AndreaSavojardo:关于这种行为是否符合标准,您是否有任何参考资料(例如 MDN 上的帖子)?
2021-04-08 06:18:39