2011-10-05 292 views
10

我正在研究追踪时间的Chrome扩展程序,并将Google App Engine用于后端。无法从Chrome扩展程序连接到本地主机

对于测试,我试图将本地版本的扩展连接到本地版本的App Engine应用程序。当我尝试发送POST请求,我越来越:

XMLHttpRequest cannot load http://localhost:8080/report . Origin chrome-extension://mbndmimplohfkkcincjodnfpaapbbmei is not allowed by Access-Control-Allow-Origin.

但是,当我更改URL,以便它张贴到appspot.com网址它的工作原理。

什么是Access-Control-Allow-Origin,为什么它阻止我从本地主机获取结果?

回答

16

我认为这是因为您无法调用未包含在清单的权限部分中的服务器。 manifest.json中的权限部分应该是这个样子:

"permissions": [ 
    "http://myapp.appspot.com/*", 
    "http://localhost/*" 
] 

注意,我没有测试过这一点,但它听起来就像是你的问题的根源。

+1

小修正。即使不在权限中,您也可以提出请求,但除非CORS配置为允许在服务器上执行此操作,否则将失败。 – Xan

+0

我已经为localhost配置了权限,但仍然无法使用。任何人都可以帮忙 –

2

您无法在权限内添加端口。您必须在权限清单内使用端口80来进行扩展。我通常运行nginx并将所有流量从扩展端口路由到端口80.

+0

这是我的第一个扩展,所以我真的不知道我在做什么。我会怎么做? – Jeremy

+3

接受的答案是正确的。我向权限添加了'“http:// localhost/*”',现在我可以执行Ajax GET:8080。 – raine

+0

谢谢@rane,很高兴知道。 –

0

我能得到这个代码工作:

var loginPayload = {}; 
loginPayload.username = document.getElementById('username').value; 
loginPayload.password = document.getElementById('password').value; 
console.log(loginPayload); 

var callback = function (response) { 
    console.log(response); 
}; 
var handle_error = function (obj, error_text_status){ 
    console.log(error_text_status + " " + obj); 
}; 

$.ajax({ 
    url: 'https://127.0.0.1:8443/hello', 
    type: 'POST', 
    success: callback, 
    data: JSON.stringify(loginPayload), 
    contentType: 'application/json', 
    error: handle_error 
}); 

编辑:
显然有人不喜欢这样,所以几件事情要记住:

  1. 对于扩展必须在https上工作,请确保您的服务器正在提供https。
  2. 相反,上述职位,Chrome扩展可以投放端口80以外/ 443
1

可以使用自定义端口的端口。

manifest.json的

"permissions": ["http://localhost/*"] 

background.js(使用jQuery)

$.post('http://localhost:5000/some-endpoint'); 
相关问题