2011-10-05 116 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');