2011-10-05 29 views
10

Tôi đang làm việc trên tiện ích mở rộng của Chrome theo dõi thời gian và sử dụng Google App Engine cho chương trình phụ trợ.Không thể kết nối với localhost từ tiện ích mở rộng của Chrome

Để thử nghiệm, tôi đang cố gắng kết nối phiên bản tiện ích mở rộng cục bộ với phiên bản cục bộ của ứng dụng App Engine. Khi tôi cố gắng để gửi một yêu cầu POST, tôi nhận được:

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

Nhưng nó hoạt động khi tôi thay đổi địa chỉ URL để nó đăng tải vào URL appspot.com.

Access-Control-Allow-Origin là gì và tại sao nó ngăn tôi nhận kết quả từ máy chủ cục bộ?

Trả lời

16

Tôi tin rằng điều này là do bạn không thể thực hiện cuộc gọi đến máy chủ không được bao gồm trong phần quyền của tệp kê khai. Phần quyền của manifest.json sẽ trông giống như sau:

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

Lưu ý, tôi chưa thử nghiệm điều này, nhưng có vẻ như đó là vấn đề của bạn.

+1

Hiệu chỉnh nhỏ. Bạn có thể thực hiện các yêu cầu ngay cả khi nó không có trong các điều khoản, nhưng trừ khi CORS được cấu hình để cho phép điều này trên máy chủ nó sẽ thất bại. – Xan

+0

Tôi đã cấu hình sự cho phép cho localhost nhưng nó vẫn không hoạt động. Bất cứ ai cũng có thể giúp đỡ? –

2

bạn không thể thêm cổng trong quyền. Bạn phải sử dụng cổng 80 cho các tiện ích trong tệp kê khai quyền. Tôi thường chạy nginx và định tuyến tất cả lưu lượng truy cập từ các tiện ích mở rộng đến cổng 80.

+0

Đây là phần mở rộng đầu tiên của tôi, vì vậy tôi không thực sự biết những gì tôi đang làm. Tôi sẽ làm như thế nào? – Jeremy

+3

Câu trả lời được chấp nhận là chính xác. Tôi đã thêm '" http: // localhost/* "' vào quyền và bây giờ tôi có thể thực hiện một Ajax GET tới: 8080. – raine

+0

Cảm ơn @rane, Rất vui được biết. –

0

tôi đã có thể nhận được mã này để làm việc:

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:
Rõ ràng ai đó đã không như thế này, do đó, một số điều cần lưu ý:

  1. Đối với phần mở rộng phải hoạt động trên https, đảm bảo máy chủ của bạn đang phục vụ https.
  2. Trái với bài viết ở trên, phần mở rộng Chrome có thể phục vụ trên các cổng khác ngoài cổng 80/443
1

Bạn thể cổng sử dụng tùy chỉnh.

manifest.json

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

background.js (sử dụng jQuery)

$.post('http://localhost:5000/some-endpoint'); 
Các vấn đề liên quan