为什么这个XMLHttpRequest在Firefox Scratchpad中工作,而在localhost上不工作?

时间:2014-01-29 12:10:58

标签: javascript json xmlhttprequest cors

我有一小段代码,我在Firefox Scratchpad中测试了一个包含所有当前可用的Ubuntu Click应用程序的json文件:

function getHttp(url, callback) {
req = new XMLHttpRequest();
req.onreadystatechange = function() {
    if (req.readyState === XMLHttpRequest.DONE) {
        callback(req.responseText);
    }
};
    req.open("GET", url, true);
    req.send();
}

 getHttp("http://search.apps.ubuntu.com/api/v1/search?q=", function(response) {
console.log(response);
});

直接从暂存器运行时,它正确地获取所需的json。然而,当我把它放在一个小html应用程序的javascript文件中时,我正在写它只返回一个空字符串响应 (页面托管在xampp安装上)

我已经在CORS的主题上挖了很多但是它似乎没有帮助我,因为必须在服务器上设置“Access-Control-Allow-Origin:”属性,对吗?

我还尝试将'withCredentials'标志设置为true ...但它不会改变任何内容。

那么为什么它使用暂存器而不是我从http://localhost/project/index.html访问它?

这是我得到的响应标题:

"Date: Wed, 29 Jan 2014 12:04:52 GMT

 Server: gunicorn/0.15.0

 Content-Type: application/json

 Expires: Wed, 29 Jan 2014 12:05:52 GMT

 X-Bzr-Revision-Number: 68

 Cache-Control: max-age=60, private

 Content-Length: 29207

 X-Cache: MISS from localhost

 X-Cache-Lookup: MISS from localhost:3128

 Via: 1.0 localhost (squid/3.1.19)

 Strict-Transport-Security: max-age=2592000"

任何提示都非常感谢...我已经挖了几个小时并试了几个小时,我真的不知道从哪里开始

2 个答案:

答案 0 :(得分:1)

URL http://search.apps.ubuntu.com/api/v1/search?q=不允许CORS请求,因为它不会在响应中发送Access-Control-Allow-Origin标头。

使用Scratchpad,您必须尝试在withCredentials域上运行代码。如果您尝试在其他域上运行相同的代码,则无法获得响应。通过http://search.apps.ubuntu.com运行代码时也是如此。

要解决此问题,您必须编写驻留在localhost上的服务器端脚本,并充当consoleindex.html之间的代理。该脚本将在URL上进行HTTP GET并将响应返回给index.html。

search.apps.ubuntu.com

NodeJS中的脚本

getHttp("ubuntuProxy", function(response) {
  console.log(response);
});

答案 1 :(得分:0)

我的猜测是你需要对请求参数进行编码。

所以而不是:

req.open("GET", url, true);
req.send();

尝试:

req.open("GET", encodeURIComponent(url), true);
req.setRequestHeader("content-type","application/x-www-form-urlencoded");
req.send();