2011-05-06 16 views
7

मैं एक jQuery प्लग-इन विकसित कर रहा हूं जो कुछ आरईएसटी एपीआई के लिए एक कनेक्टर होगा। कार्यान्वयन सीधे आगे है, लेकिन वही मूल नीति निश्चित रूप से दर्दनाक है। मुझे अधिकतर POST अनुरोध करने की आवश्यकता है।jQuery और क्रॉस डोमेन पोस्ट अनुरोध

मैं भी (अजगर है, लेकिन अर्थ स्पष्ट किया जाना चाहिए) विकल्प विधि को लागू करने की कोशिश की और लौटने

def options(self): 
    self.response.headers['Access-Control-Allow-Origin'] = self.request.host_url 
    self.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    self.response.headers['Access-Control-Allow-Headers'] = 'x-requested-with' 
    self.response.headers['Access-Control-Max-Age'] = '1728000' 

अभी भी काम नहीं करता है ... किसी भी विचार?

पुनश्च: मैंने देखा है एक समान विषय के साथ अन्य प्रश्न देखते हैं कि लेकिन मैं POST पद्धति के लिए एक विशिष्ट समाधान (प्राप्त easely iframes का उपयोग कर के द्वारा कार्यान्वित किया जा सकता है)

जावास्क्रिप्ट उदाहरण की जरूरत है:

$.ajax({ 
    url: options.protocol+'://'+options.host+':'+options.port+'/'+method, 
    data: rawData, 
    async:false, 
    dataType: "json", 
    type:"POST", 
    success:function(data) 
    { 
     alert('asd'); 
     result.data = data; 
     alert(data); 
    }, 
    error:function(lol){ 
     alert('omggg !!!!'+lol); 
    } 

}); 

संपादित करें: जोड़ा जावास्क्रिप्ट कोड उदाहरण

+0

क्या क्रॉस डोमेन हेडर ब्राउज़र में समर्थित हैं जिन्हें आपको समर्थन देने की आवश्यकता है? –

+0

क्या आपने केवल 'पहुंच-नियंत्रण-अनुमति-उत्पत्ति' के साथ प्रयास किया और इसे '*' पर सेट किया? यह हमेशा मेरे लिए काम किया है। – mekwall

+0

अच्छी तरह से, मुझे बस एक लेख मिला जो उन शीर्षकों की भूमिका समझा रहा था। परीक्षण के लिए मैं फ़ायरफ़ॉक्स का उपयोग कर रहा था और अकसर मुझे रिटर्न बॉडी (थक्स httpfox) मिला लेकिन मुझे सफलता की विधि नहीं मिली (jQuery.ajax) – Cesar

उत्तर

9

यह एक बेला का एक सा कभी कभी है, कुछ विचार:

  • सीओआरएस केवल आधुनिक आधुनिक ब्राउज़र द्वारा समर्थित है, इसलिए आपको यह सुनिश्चित करना होगा कि आप उनमें से किसी एक का उपयोग कर रहे हैं।
  • केवल आईई XDomainRequest वस्तु, नहीं मानक XMLHttpRequest वस्तु के माध्यम से CORS का समर्थन करता है, लेकिन विशेष रूप से jQuery उस के लिए पूरा नहीं करता (अभी तक, मैं स्वीकार करने के लिए मैं थोड़ा हैरान हूँ है और यह पहले बहुत लंबा होगा उम्मीद), तो आपको IE पर यह काम करने के लिए विशेष हैंडलिंग जोड़नी होगी (और फिर केवल IE8 और ऊपर)। संपादित: हैरानी की बात है, जाहिरा तौर jQuery टीम उस अनुरोध किया है और इसका खंडन किया: ticket #8283 कि कोई समझ में आता है।
  • क्या आप वाकई Access-Control-Allow-Origin मूल्य के बारे में सुनिश्चित हैं? यह दिखता है जैसे यह केवल उस सर्वर से पहुंच की अनुमति देता है जिस पर यह चालू है। वह हेडर यह निर्दिष्ट करने के लिए है कि सर्वर किस उत्पत्ति को से अनुरोध करने की अनुमति देगा। (और * का मतलब "कहीं भी" है।)
  • मुझे फ़ायरफ़ॉक्स के साथ अपने प्रयोगों से याद आ रहा है कि OPTIONS अनुरोध का जवाब देने पर यह मेरी अनुमति विधियों के बारे में परिचित था।
  • दो बार जांचें कि आप सभी हेडर भेज रहे हैं, जो अनुरोध भेज रहे हैं; आपके उदाहरण में ऐसा लगता है कि आप केवल एक हेडर (x-requested-with) की अनुमति दे रहे हैं, लेकिन मुझे लगता है कि वास्तविक अनुरोध में अन्य लोग होंगे।

FWIW (मैं एक अजगर पुरुष नहीं कर रहा हूँ), यहाँ मेरी JSP कोड है कि काम करता है, शायद यह उपयोगी   — मुझे लगता है कि वस्तु के नाम काफी स्पष्ट पठनीय भले ही आप जावा नहीं करते हो रहे हैं हो जाएगा (और कौन जानता है, शायद आप करते हैं):

String corsOrigin, corsMethod, corsHeaders; 

// Find out what the request is asking for 
corsOrigin = request.getHeader("Origin"); 
corsMethod = request.getHeader("Access-Control-Request-Method"); 
corsHeaders = request.getHeader("Access-Control-Request-Headers"); 
if (corsOrigin == null || corsOrigin.equals("null")) { 
    // Requests from a `file://` path seem to come through without an 
    // origin or with "null" (literally) as the origin. 
    // In my case, for testing, I wanted to allow those and so I output 
    // "*", but you may want to go another way. 
    corsOrigin = "*"; 
} 

// Add headers allowing specifically what was requested 
response.addHeader("Access-Control-Allow-Origin", corsOrigin); 
response.addHeader("Access-Control-Allow-Methods", corsMethod); 
response.addHeader("Access-Control-Allow-Headers", corsHeaders); 
if (request.getMethod().equals("OPTIONS")) 
{ 
    // Done, no body in response to OPTIONS 
    return; 
} 
// Processing the GET or POST here; output the body of the response 

ध्यान दें कि मैं बिल्कुल GET के लिए एक ही तर्क का उपयोग कर रहा हूँ, POST, और OPTIONS कि विकल्प के मामले को छोड़कर, मैं नहीं उत्पादन एक प्रतिक्रिया शरीर करना ।

+0

काफी अच्छा काम करता है, धन्यवाद :) – Cesar

+2

@ सीज़र: आह, अच्छा! खुशी हुई कि मदद की। –

संबंधित मुद्दे