2011-10-05 18 views
10

मैं क्रोम एक्सटेंशन पर काम कर रहा हूं जो समय ट्रैक करता है, और बैकएंड के लिए Google App Engine का उपयोग करता है।क्रोम एक्सटेंशन से स्थानीयहोस्ट से कनेक्ट नहीं हो सकता

परीक्षण के लिए, मैं ऐप इंजन ऐप के स्थानीय संस्करण में विस्तार के स्थानीय संस्करण को जोड़ने का प्रयास कर रहा हूं। जब मैं एक पोस्ट अनुरोध भेजने का प्रयास करें, मैं हो रही है:

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

लेकिन यह काम करता है जब मैं URL बदल इतना है कि यह appspot.com यूआरएल पर भी पोस्ट कर।

एक्सेस-कंट्रोल-अनुमति-उत्पत्ति क्या है, और यह मुझे स्थानीयहोस्ट से परिणाम प्राप्त करने से क्यों रोक रहा है?

उत्तर

16

मुझे विश्वास है क्योंकि ऐसा इसलिए है क्योंकि आप किसी ऐसे सर्वर पर कॉल नहीं कर सकते हैं जो आपके मैनिफेस्ट के अनुमति अनुभाग में शामिल नहीं है। manifest.json की अनुमतियां अनुभाग कुछ इस तरह दिखना चाहिए:

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

ध्यान दें, मैं इस परीक्षण नहीं किया है, लेकिन यह लगता है कि वह जगह है जहाँ आपकी समस्या से आ रही है।

+1

छोटे सुधार। आप अनुरोध कर सकते हैं भले ही यह अनुमतियों में न हो, लेकिन जब तक सर्वर पर इसे अनुमति देने के लिए CORS कॉन्फ़िगर नहीं किया जाता है, तो यह असफल हो जाएगा। – Xan

+0

मैंने पहले ही लोकहोस्ट के लिए अनुमति कॉन्फ़िगर की है लेकिन यह अभी भी काम नहीं कर रही है। कोई भी मदद कर सकता है? –

2

आप अनुमतियों के भीतर बंदरगाहों को जोड़ नहीं सकते हैं। आपको अनुमति मैनिफेस्ट के भीतर एक्सटेंशन के लिए पोर्ट 80 का उपयोग करना होगा। मैं आमतौर पर nginx चलाता हूं और अपने एक्सटेंशन से पोर्ट 80 तक सभी ट्रैफिक रूट करता हूं।

+0

यह मेरा पहला विस्तार है, इसलिए मैं वास्तव में नहीं जानता कि मैं क्या कर रहा हूँ। मुझे यह कैसे करना है? – Jeremy

+3

स्वीकृत उत्तर सही है। मैंने अनुमतियों के लिए 'http: // localhost/*" 'जोड़ा है और अब मैं एक अजाक्स प्राप्त कर सकता हूं: 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. विपरीत ऊपर पोस्ट, क्रोम एक्सटेंशन/443
1

आप कर सकते हैं उपयोग कस्टम बंदरगाहों पोर्ट 80 के अलावा अन्य बंदरगाहों पर सेवा कर सकते हैं।

manifest.json

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

background.js (jQuery का उपयोग कर)

$.post('http://localhost:5000/some-endpoint'); 
संबंधित मुद्दे