代码之家  ›  专栏  ›  技术社区  ›  PurplePilot

xmlhttprequest中的空responsetext

  •  27
  • PurplePilot  · 技术社区  · 15 年前

    我编写了一个运行良好但返回空responseText的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总是空白的。

    我在safari调试中得到一个错误调度的日志错误:getproperties,我似乎找不到它的引用。

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

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

    我在一个运行良好的mac小部件中对同一个url编写了类似的代码,但浏览器中的相同代码永远不会返回结果。

    5 回复  |  直到 10 年前
        1
  •  26
  •   Community CDub    7 年前

    http://api.xxx.com/ 你的领域的一部分?如果没有,您将被 same origin policy .

    您可能需要查看以下堆栈溢出日志以获得一些可能的解决方法:

        2
  •  12
  •   choroba    10 年前

    问题已解决

    在我的例子中,问题是我使用 全路径 在URL参数中:

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

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

    网址:“site/cgi-bin/serverapp.php”

    有些浏览器不冲突,也不区分文本,但在Firefox 3.6 for Mac OS中就采用了这种方式。 完整路径 作为” 跨站点脚本 “……”另一件事是,在同一个浏览器中,存在以下区别:

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

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

    实际上,它是正确的观点,但大多数实现没有区别,因此解决方案是删除指定 全路径 到执行Ajax请求的方法中的脚本 …删除任何 基地 index.html文件中的标记

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

    如果您不删除它,这个系统的浏览器版本可能会接受您的Ajax请求,就像它是一个跨站点请求一样!

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

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

    为了确保浏览器以“JSON数据”的形式获取数据…

        3
  •  4
  •   Jacob Relkin    12 年前

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

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

        4
  •  1
  •   swl1020    13 年前

    这可能不是最好的方法。但不知怎的,它对我有用,所以我要用它来跑。

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

    现在可以肯定为什么它起作用了,但它起作用了。

        5
  •  0
  •   Community CDub    7 年前

    有一个和你类似的问题。我们要做的是使用这里的document.domain解决方案:

    Ways to circumvent the same-origin policy

    我们还需要更改Web服务方面的内容。已使用此处找到的“访问控制允许来源”标题:

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