Chrome应用jquery AJAX请求不发送自定义标头

时间:2014-08-26 20:18:48

标签: javascript ajax cors google-chrome-app chrome-web-store

我正在开发一个Chrome应用,该应用使用jquery.ajax向我的API发出一系列请求。使用清单中的api设置的url权限,这很好用:

"permissions": [ 
    "https://example.com/*",
    "http://example.com/*"
]

但是,当我尝试将其上传到Chrome开发人员信息中心时,我收到错误消息:

The field permissions.https://example.com/ is not allowed in manifest.

我认为这是因为Chrome应用程序正在转向CORS模型,尽管网址权限仍为shown in the documentation。我正在尝试实施CORS。

{
    "name": "My Extensions",
    "version": "1.0.7.5",
    "manifest_version": 2,
    "app": {
        "launch": {
            "local_path": "pages/index/index.html"        
        }
    },
    "description": "Extension description.",
    "content_security_policy": "script-src 'self'; object-src 'self'; connect-src self https://example.com http://example.com",
    "icons": {
        "16": "images/msp-16.png",
        "128": "images/msp-128.png",
        "256": "images/msp-256.png"
    },
    "minimum_chrome_version": "14",
    "permissions": [ 
        "tts",
        "unlimitedStorage",
        "storage"
    ]
}

和ajax请求:

$.ajax({
    cache: false,
    crossDomain: true,
    async: false,
    headers: {
        'apikey': 'myapikey'
    },
    url: 'https://example/api/auth/',
    type: 'POST',
    data: {
        data: xmlToSubmit
    },
    success: function(xml) {

        //Do the thing

    },
    error: function(xhr) {

        //Do the other thing

    }
});

我已阅读了很多文档,包括HTML Rocks。我发送了一个自定义标题' apikey'。服务器当前配置为:

Header set Access-Control-Allow-Origin: "*"
Header set Access-Control-Allow-Methods: "POST, GET, OPTIONS"
Header set Access-Control-Allow-Headers: "apikey"

当我从应用程序发出请求时,由于尚未发送apikey标头而返回错误。我得到api生成的预期xml错误消息。我已经使用Fiddler进行了检查,并且没有发送apikey标头。我可以向其他Chrome扩展REST客户端发送成功请求到我的api,我也不需要为其他向api发送请求的应用设置服务器标头,也不需要使用原始权限。

我错过了什么?它只是预检失败了吗?我是否遗漏了允许其上传的原始权限中显而易见的内容?

1 个答案:

答案 0 :(得分:0)

这是通过@xan和@sowbug暗示的解决的。通过更改清单以将启动后台脚本称为“新”打包应用程序,并进行一些小的代码更改,这实现了一个梦想:

"app": {
    "background": {
        "scripts": ["launch.js"]
    }
},

访问api的url权限已添加回清单

"permissions": [ 
    ...
    "https://example.com/",
    "http://example.com/",
    ....
],

我还必须从jquery AJAX请求中删除此设置:

async: false;
I read this之后