XMLHttpRequest 状态0(response seText 为空)

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

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”。

本地主机请求也是同样的情况(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)

什么会导致联机请求出现问题(status = 0) ?

PS: Live HTTP Headers shows that everything is OK in all 4 cases:

HTTP/1.1 200 OK
Content-Length: 4742

PS2: VMWare 上的 Apache 本地 Web 服务器(主机 OS Win7,客户 OS Ubuntu,网络适配器 -NAT)。浏览器-火狐。

246294 次浏览

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

不能执行跨域 XMLHttpRequest。

The call to 127.0.0.1 works because your test page is located at 127.0.0.1, and the local test also works since, well... it's a local test.

The other two tests fail because JavaScript cannot communicate with a distant server through XMLHttpRequest.

You might instead consider either:

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

希望能帮上忙

你问题的原因是 you are trying to do a cross-domain call and it fails

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

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

signed.applets.codebase_principal_support = true

然后在 XHR 开放代码中添加以下代码:

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

对于 IE 浏览器,如果我没记错的话,你所要做的就是启用浏览器的安全设置“杂项 & rarr; 访问跨域数据源”,让它与 ActiveX XHR 一起工作。

IE8及以上版本还向原生 XmlHttpRequest 对象添加了跨域功能,但我还没有使用过这些功能。

如果服务器响应 OPTION 方法并响应 GET 和 POST (无论您使用哪种方法) ,则头部如下:

Access-Control-Allow-Origin: *

It might work OK. Seems to in FireFox 3.5 and rekonq 0.4.0. 显然,有了这个头和对 OPTION 的初始响应,服务器就会对浏览器说,“继续,让这个跨域请求通过。”

我也遇到过类似的问题。一切正常,“ readystate”是4,但“ status”是0。这是因为我使用的是一个 Apache PHP 可移植服务器,而我在其中使用“ XMLHttpRequest”对象的文件是一个 html 文件。我把文件扩展名改成了 php,问题就解决了。

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

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

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

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

通过检查我的 html 代码,类似的问题得到了解决。我有一个 onclick处理程序在我的表单提交按钮到一个方法。像这样: onclick="sendFalconRequestWithHeaders()"。这个方法依次调用 ajax,就像您的方法一样,并执行我想要的操作。但不如预期,我的浏览器没有返回任何东西。

某人的辛勤工作中学习,我在这个处理程序中返回 false,并解决了。 在写这篇文章之前,我花了整整3天的周末和半天的时间在办公室写代码实现 CORS filtersjetty config和其他 jersey and embedded jetty相关的东西——就是为了解决这个问题。在 javascript 中简单的错误会让你变得愚蠢,这太荒谬了。

事实上,我已经尝试了 signed.applets.codebase_principal_support = true并编写了 isLocalHost() **if**。可能这个方法需要我们来实现,火狐说没有这样的 现在,我必须清理我的代码,以提交 git 补丁干净。

下面是 status === 0特定于上传的另一种情况:

如果您将 'load'事件处理程序附加到 XHR.upload,作为 由 MDN 建议(向下滚动到“监视进度”的上传部分) ,XHR 对象将具有 status=0,并且所有其他属性将是空字符串。如果像下载内容时那样将 'load'处理程序直接附加到 XHR 对象,那么应该没有问题(因为您没有离开本地主机)。

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

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

亚历克斯 · 罗宾逊(Alex Robinson)已经(并且首先)给出了这个问题的正确答案。

必须添加 HTTP 响应头:

Access-Control-Allow-Origin: *

如果您这样做,结果不仅仅是“可能有用”,而是“将有用”。

NB What you need to add is an HTTP 回应 header - so you can only do this on a server which you control. It will never be possible to directly fetch http://w3schools.com/XML/cd_catalog.xml from its original URL using an XMLHttpRequest (as per OP's question), because that resource does not (at least, not as of 24 Apr 2015) include any such CORS header.

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

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

亚历克斯罗宾逊和 bmju 提供了宝贵的信息,了解跨来源的问题。我想补充的是,在进行所需的 GET/POST (例如,针对 CORS OAuth 服务端点)之前,您可能需要在客户机代码中进行显式的 OPTION 调用。您的浏览器/库可能无法自动处理 OPTION 请求。Gruber 这是你问题的可能答案之一。

Consider also the 请求暂停:

现代浏览器返回 ReadyState = 4和 s状态 = 0如果在服务器响应之前过了太长的时间。

我遇到了同样的问题 (readyState 为4,status 为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);
});
});

打开 javascript console。您将在那里看到一个错误消息。在我的例子中是 CORS。

要查看问题是什么,当你得到一个神秘的错误0时,点击... | 更多工具 | Chrome 中的开发工具(Ctrl + Shift + I)(在给出错误的页面上)

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

我的第一个问题是,我第一次为浏览器传递授权头文件到我自己的跨域 Web 服务。

我已经有了:

Access-Control-Allow-Origin: *

But not:

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

in the response header of my web service.

在我添加了这些内容之后,我的错误0从我自己的 web 服务器上消失了,在没有 web 服务器的情况下在本地运行 index.html 文件时也消失了,但是仍然在代码笔中出现错误。

返回... | More Tools | Developer Tools 当在 codepen 中得到错误时,有明确的解释: codepen 使用 https,所以我不能调用 http,因为安全性较低。

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

知道如何得到真正的错误消息-无价!

我必须将当前的 IP 地址(再次)添加到 Atlas MongoDB 白名单,因此消除了 XMLHttpRequest 状态0错误

我只是有这个问题,因为我使用 0.0.0.0作为我的服务器,改为 localhost和它的工作。

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

当我尝试在烧瓶环境中使用由 python 创建的一些 Web 方法时,遇到了同样的问题,这些方法是 XMLHttpRequest 创建的。 在检查了 Firefox 控制台之后,我意识到问题的原因是相同的起源策略,它阻止调用不同 起源的 web 方法(一个起源包含三个元组,包括: 协议、域和端口号)。 对我来说,解决方案是使用 CORS,幸运的是有一个名为 烧瓶的 Python 包,我使用它,一切都很好。