来自 XMLHttpRequest 的空响应文本

IT技术 javascript ajax xmlhttprequest
2021-01-29 01:37:25

我编写了一个运行良好但返回空响应文本的 XMLHttpRequest。

javascript如下:

  var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
  var myRequest = new XMLHttpRequest();

  callAjax(anUrl);

  function callAjax(url) {
     myRequest.open("GET", url, true);
     myRequest.onreadystatechange = responseAjax;
                 myRequest.setRequestHeader("Cache-Control", "no-cache");
     myRequest.send(null);
  }

  function responseAjax() {
     if(myRequest.readyState == 4) {
        if(myRequest.status == 200) {
            result = myRequest.responseText;
            alert(result);
            alert("we made it");
        } else {
            alert( " An error has occurred: " + myRequest.statusText);
        }
     }
  }

代码运行良好。我可以走过去,我得到 readyState == 4 和 status == 200 但 responseText 始终为空。

我收到 Error dispatching: getProperties 的日志错误(在 Safari 调试中),我似乎找不到参考。

我已经在本地和远程服务器上在 Safari 和 Firefox 中运行了代码。

放入浏览器的 URL 将返回字符串并给出 200 的状态代码。

我在运行良好的 Mac Widget 中为相同的 URL 编写了类似的代码,但浏览器中的相同代码永远不会返回结果。

5个回答

http://api.xxx.com/您域的一部分吗?如果不是,您将被同源策略阻止

您可能需要查看以下 Stack Overflow 帖子以了解一些可能的解决方法:

@The Rook:感谢您的留言。修正了我的答案。
2021-03-20 01:37:25
我有一种感觉,可能就是这样。令人费解的是,在 Mac Widget 中,我使用 XMLHttpRequest 来做同样的事情并且它可以工作。我假设在小部件的情况下,我不在浏览器中,所以没有被阻止。
2021-04-08 01:37:25
其实这和xss没有关系,xss是因为验证用户输入失败造成的。使用 XHR 访问另一个域违反了同源政策:code.google.com/p/browsersec/wiki/Part2
2021-04-10 01:37:25

问题已解决

在我的情况下,问题是我在 url 参数中使用完整路径执行 ajax 调用(使用 $.ajax、$.get 或 $.getJSON 方法来自 jQuery)

网址:“ http://mydomain.com/site/cgi-bin/serverApp.php

但正确的方法是将 url 的值传递为:

网址:“站点/cgi-bin/serverApp.php”

一些浏览器不冲突,也不区分一个文本或另一个文本,但在 Mac OS 的 Firefox 3.6 中将此完整路径作为“跨站点脚本”......另一件事,在同一浏览器中,两者之间存在区别:

http://mydomain.com/site/index.html

并放

http://www.mydomain.com/site/index.html

事实上,这是正确的观点,但大多数实现没有区别,所以解决方案是删除所有指定脚本完整路径的文本,这些文本在执行 ajax 请求的方法中指定了脚本完整路径AND .... 删除任何BASE标记在 index.html 文件中

base href="http://mydomain.com/" <--- 坏主意,删除它!

如果你不删除它,这个系统的这个版本的浏览器可能会把你的ajax请求当作跨站请求!

我有同样的问题,但只在 Mac OS 机器上。问题是 Firefox 将 ajax 响应视为“跨站点”调用,在任何其他机器/浏览器中它都可以正常工作。我没有找到任何有关此的帮助(我认为这是一个 Firefox 实现问题),但我将在服务器端证明下一个代码:

header('Content-type: application/json');

确保浏览器将数据作为“json 数据”...

添加响应头 Content-Type: application/json 对我有用。
2021-04-09 01:37:25

浏览器阻止您进行跨站点脚本编写。

如果 url 在您的域之外,那么您需要在服务器端执行此操作或将其移动到您的域中。

这可能不是最好的方法。但它以某种方式对我有用,所以我要运行它。

在我的返回数据的 php 函数中,在返回行之前的一行,我添加了一个 echo 语句,回显我要发送的数据。

现在确定它为什么起作用了,但它确实起作用了。

遇到了和你类似的问题。我们必须做的是使用这里找到的 document.domain 解决方案:

规避同源策略的方法

我们还需要更改 Web 服务端的细化。使用此处找到的“Access-Control-Allow-Origin”标头:

https://developer.mozilla.org/En/HTTP_access_control