【问题标题】:Failing AJAX request in a Chrome extension, with correct manifest permissions?Chrome 扩展中的 AJAX 请求失败,具有正确的清单权限?
【发布时间】:2012-03-30 16:35:57
【问题描述】:

我正在编写一个 Chrome 扩展程序,它执行一个简单的 ajax 调用(基于文档中的 this example):

$.ajax({
    type: "GET",
    url: "http://www.flags.99k.org/getFlags.php"
}).done(function(response) {
    alert("SUCCESS: " + response);
}).fail(function(response) {
    alert("FAILURE: " + response);
});

请求总是失败,因为警报显示:FAILURE: [object Object]
URL 有效:当我在地址栏中输入http://www.flags.99k.org/getFlags.php 时,我得到了这个:

[{"UID": "1", "Message": "Hello"}, {"UID": "2", "Message": "World"}, {"UID": "3", "Message": "Hello World"}]

这是我的扩展名 manifest.json。

{
  "name": "Hello World",
  "version": "1.0",
  "description": "The first extension that I made.",
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
      "http://www.flags.99k.org/"
  ]
}

我使用 Chromium 17.0.963.79(Developer Build 125985 Linux)Ubuntu 11.10。

【问题讨论】:

  • JavaScript 代码是如何执行的?它看起来像injected。您使用的是哪个 Chrome 版本? manifest.json的内容是什么?
  • @MikeChristensen 我可以从错误函数中获得的信息不是很有帮助:readyState: 0, responseText: "", status: 0, statusText: "error"...
  • @RobW 代码的运行方式与 getstarted 示例 (code.google.com/chrome/extensions/getstarted.html) 中的运行方式相同,来自我的 default_popup 页面头部的脚本标记。但我已经设法在 jsfiddle 中重现了这个问题(请参阅我的编辑)。

标签: ajax google-chrome jquery google-chrome-extension


【解决方案1】:

目前,仅允许通过清单中的权限访问根目录。您必须在 URI 之后 为权限添加通配符:

  "permissions": [
    "http://www.flags.99k.org/*"
  ]

另请参阅:Match patterns

编辑:更新后的代码不起作用,因为http://www.flags.99k.org/ 重定向到http://flags.99k.org/(没有www)。因此,还要将此位置列入白名单:

  "permissions": [
    "http://flags.99k.org/*",
    "http://www.flags.99k.org/*"
  ]

【讨论】:

  • 你这个鬼鬼祟祟的人!一个有趣的发现,但它仍然不能解决我的问题......主机本身是否有可能阻止我的请求?
  • @Shawn 我已经成功测试过了。文件:manifest.jsonpopup scriptpopup page。和 jQuery:jq.js(都在同一个扩展目录中)。
  • 知道了!我的问题是我对清单所做的更改没有被考虑在内,即使我点击“立即更新扩展”。要查看更改的结果,我必须“删除”我的扩展程序并重新“加载解压缩的扩展程序...”。这是正常的吗?非常感谢您的帮助!
  • @Shawn 这当然不正常,但我对这个错误很熟悉。为了可靠地重新加载打包的扩展,我必须:1)删除扩展 2)关闭chrome://extensions/。 3) 将 crx 文件拖到浏览器中,以便安装。 >>> 对于解压的扩展,点击“重新加载扩展”就足够了。
【解决方案2】:

而不是做...

alert("FAILURE: " + response);  

...做...

console.debug('FAILURE');
console.debug(response);

然后,如果您转到控制台(Windows 上的 ctrl-shift-j),您将看到一个可以展开以查看其所有属性以及其他属性的对象,这真的很有帮助。另外,您在提出请求时是否查看过控制台?您可能会在此处收到一些错误消息。

【讨论】:

  • 谢谢,虽然对象的内容没有用:readyState: 0, responseText: "", status: 0, statusText: "error"...
【解决方案3】:

这可能是一个跨域问题。

当您在地址栏中输入 URL 时,它会起作用,因为它是从主机传送到您的浏览器的。

因为您试图访问托管域之外的完整 URL - 您可能需要使用 JSONP。

【讨论】:

  • 作为 Chrome 扩展程序,如果他想进行跨域调用,只要将所需的 url 放入清单的权限部分即可。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多