2011-10-05 14 views
10

Pracuję nad rozszerzeniem Chrome, które śledzi czas i używa Google App Engine do obsługi backendu.Nie można połączyć się z lokalnym hostem z rozszerzenia przeglądarki Chrome

Do testowania próbuję podłączyć lokalną wersję rozszerzenia do lokalnej wersji aplikacji App Engine. Gdy próbuję wysłać żądanie POST, Dostaję:

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

Ale to działa, kiedy zmienić adres URL tak, że słupy do adresu URL appspot.com.

Co to jest Access-Control-Allow-Origin i dlaczego nie pozwala mi uzyskać wyników z localhost?

Odpowiedz

16

Uważam, że dzieje się tak, ponieważ nie można wykonywać połączeń z serwerem, który nie znajduje się w sekcji uprawnień w manifeście. W sekcji Uprawnienia z manifest.json powinien wyglądać mniej więcej tak:

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

Uwaga, nie testowałem, ale wygląda na to, że jest gdzie twój problem pochodzi.

+1

Mała korekta. Możesz wysyłać żądania, nawet jeśli nie ma ich w uprawnieniach, ale chyba, że ​​CORS jest skonfigurowany, aby zezwalać na to na serwerze, to się nie powiedzie. – Xan

+0

Skonfigurowałem już uprawnienie dla localhost, ale nadal nie działa. Ktoś może pomóc? –

2

Nie można dodawać portów w ramach uprawnień. Musisz użyć portu 80 dla rozszerzeń w manifeście uprawnień. Zwykle uruchamiam nginx i przekierowuję cały ruch z moich rozszerzeń do portu 80.

+0

To moje pierwsze rozszerzenie, więc tak naprawdę nie wiem, co robię. Jak to zrobić? – Jeremy

+3

Przyjęta odpowiedź jest poprawna. Dodałem "http: // localhost/*" 'do uprawnień i mogę teraz wykonać Ajax GET na: 8080. – raine

+0

Dzięki @rane, dobrze wiedzieć. –

0

I był w stanie uzyskać ten kod do pracy:

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 
}); 

EDIT:
Widocznie ktoś nie podoba, więc kilka rzeczy, aby pamiętać:

  1. rozszerzeń które muszą działać na https, upewnij się, że twój serwer obsługuje https.
  2. W przeciwieństwie do stanowisk powyżej, rozszerzenia Chrome może służyć na portach innych niż port 80/443
1

Wy może wykorzystanie niestandardowych portów.

manifest.json

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

background.js (jQuery)

$.post('http://localhost:5000/some-endpoint'); 
Powiązane problemy