1

我遇到了与 SO 上的另一个问题类似的问题,“XMLHttpRequest not working in Google Chrome Packaged Web App”。但是,选定的答案对我不起作用。我确实在清单权限中列出了我试图请求的 url。正如我在 Chrome 的Cross-Origin XMLHttpRequestEmbed 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&param2=val2

当在浏览器中加载时,它会返回简单且有效的 JSON:

{
    "ret" : [

        { "date": 1380603600000, "foo": bar1 }, 
        { "date": 1380776400000, "foo": bar2 }
    ]
}

我在开发者控制台中用来测试的功能是这样的:

xhr('https://prefix.domain.suffix/sub/serve.aspx?param1=val1&param2=val2', function(e){ console.log(e); });

打印到控制台的所有内容是error:xhr此时是:

XMLHttpRequest {statusText: "", status: 0, response: "", responseType: "", responseXML: null…}

可能需要考虑的另一件事是,我请求的这个 url 落后于我的服务器上的身份验证。我已经登录并且能够访问该页面,无论我使用哪个选项卡,所以我认为这不是问题,但它仍然可能是。

4

2 回答 2

3

应用程序不会共享您浏览器的 cookie 存储。在这方面,它们就像原生应用程序。所以你的最后一段可能是问题所在。更改为不需要身份验证的服务器作为测试来确认它。然后调查 chrome.identity。

于 2013-11-22T16:25:00.460 回答
-2
 if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp = new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }

尝试这个...

于 2013-10-05T13:47:24.520 回答