我遇到了与 SO 上的另一个问题类似的问题,“XMLHttpRequest not working in Google Chrome Packaged Web App”。但是,选定的答案对我不起作用。我确实在清单权限中列出了我试图请求的 url。正如我在 Chrome 的Cross-Origin XMLHttpRequest和Embed Content docs 中读到的那样,我感觉这与防止跨站点脚本编写有关。
当我检查响应时,一切都是空的,没有status
代码,没有response
,没有statusText
,就像在 XSS 中尝试跨域发出请求时发生的情况一样,如这个 SO 问题所示:Empty responseText from XMLHttpRequest。
这是我的清单:
{
"manifest_version" : 2,
"name": "{name}",
"description" : "{description}",
"version" : "0.1",
"minimum_chrome_version": "23",
"permissions": [
"idle",
"storage",
"notifications",
"https://prefix.domain.suffix/*",
"https://prefix.domain.suffix/sub/"
],
"app": {
"background": {
"scripts": ["models.js", "background.js"]
}
},
"icons": { "16": "icon-16.png", "128": "icon-128.png" }
}
我正在使用此功能来执行请求:
function xhr(url, callback){
var timeout= 2000;
var xhr = new window.XMLHttpRequest();
xhr.ontimeout = function () {
console.error("The request for " + url + " timed out.");
};
xhr.onerror = function(){
console.error("error: "+xhr.statusText);
}
xhr.onload = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
window.console.log("response: "+xhr.response);
callback(JSON.parse(xhr.response));
} else {
console.error(xhr.statusText);
}
}
};
xhr.open("GET", url, true);
xhr.timeout = timeout;
xhr.send(null);
}
我试图请求的 url 是相当基本的,最后添加了一些查询字符串参数,如下所示:
https://prefix.domain.suffix/sub/serve.aspx?param1=val1¶m2=val2
当在浏览器中加载时,它会返回简单且有效的 JSON:
{
"ret" : [
{ "date": 1380603600000, "foo": bar1 },
{ "date": 1380776400000, "foo": bar2 }
]
}
我在开发者控制台中用来测试的功能是这样的:
xhr('https://prefix.domain.suffix/sub/serve.aspx?param1=val1¶m2=val2', function(e){ console.log(e); });
打印到控制台的所有内容是error:
,xhr
此时是:
XMLHttpRequest {statusText: "", status: 0, response: "", responseType: "", responseXML: null…}
可能需要考虑的另一件事是,我请求的这个 url 落后于我的服务器上的身份验证。我已经登录并且能够访问该页面,无论我使用哪个选项卡,所以我认为这不是问题,但它仍然可能是。