2010-06-18 17 views
5

Since you can't apply custom headers on JSONP calls, मैं क्रॉस डोमेन अनुरोध कैसे बना सकता हूं और jQuery का उपयोग कर कस्टम हेडर लागू कर सकता हूं?क्या जावास्क्रिप्ट में क्रॉस-डोमेन अनुरोध करना और कस्टम हेडर सेट करना संभव है?

मैं मूल रूप से jQuery के साथ गूगल डॉक्स में पहुंचने में कोशिश कर रहा हूँ और एक प्रमाणीकरण टोकन पारित करने के लिए की जरूरत है:

var token = "my-auth-token"; 
$.ajax({ 
    url: "http://docs.google.com/feeds/documents/private/full?max-results=1&alt=json", 
    dataType: 'json', 
    beforeSend: function(xhr) { 
    xhr.setRequestHeader("Authorization", "GoogleLogin auth=" + token); 
    }, 
    success: function(data, textStatus, XMLHttpRequest) { 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    } 
}); 

नोट: इस के लक्ष्य पूरी तरह से बाईपास अनुप्रयोग परत है। Google डेटा एपीआई से कनेक्ट करने के लिए रूबी का उपयोग करना आसान है, लेकिन यह हर समय सर्वर-साइड फ़ीड्स को पार्स करने में बहुत सारे संसाधनों को लेता है।

+3

आप उसी कारण से नहीं कर सकते हैं, क्योंकि आप 'myBank.com' पर उसी प्रकार के अनुरोध नहीं कर सकते हैं, जो या तो मेरी जानकारी प्राप्त करेगा या मेरा खाता लॉक करेगा, या तो कोई भी अवांछनीय है ... और वास्तव में इस तरह के क्रॉस-डोमेन अनुरोधों की अनुमति क्यों नहीं है। –

उत्तर

5

आप डॉक्स एपीआई से पूछताछ के लिए Google की जावास्क्रिप्ट क्लाइंट लाइब्रेरी का उपयोग कर सकते हैं। हालांकि यह विशेष रूप से डॉक्स के लिए मददगार के साथ नहीं आता है, फिर भी यह डॉक्स समेत अधिकांश एपीआई के साथ उपयोग किया जा सकता है। एक Google कर्मचारी द्वारा यह blog post देखें जो एक कार्य उदाहरण दिखाता है।

यदि आप प्राधिकरणों के अनंत लूप में समाप्त होते हैं, तो Google समूह से यह related question देखें। असल में, कुकीज़ पर्याप्त तेज़ी से सेट नहीं हो रही हैं, इसलिए जब जावास्क्रिप्ट क्लाइंट लाइब्रेरी जांचता है, तो उसे ओथ प्राधिकरण पृष्ठ पर कुछ भी नहीं मिलता है और रीडायरेक्ट करता है। एक समाधान है कि चेक करने से पहले या तो एक छोटी देरी जोड़ें, या एक लॉगिन बटन का उपयोग करें जो पेज लोड पर इसे करने के बजाय प्राधिकरण शुरू करता है।

आपको उसी पृष्ठ पर रहने वाले आपके पृष्ठ पर कोई भी छवि जोड़ने की आवश्यकता होगी। इसे सीएसएस के साथ छुपाया जा सकता है, जब तक कि डोम में।

उपर्युक्त ब्लॉग पोस्ट में उदाहरण का उपयोग करके, मैं अकेले जावास्क्रिप्ट के साथ अपनी दस्तावेज़ सूची पुनर्प्राप्त करने में सक्षम था। यहाँ संशोधित इनिशियलाइज़ समारोह मैं इस्तेमाल किया अनंत प्राधिकरण पाश से छुटकारा पाने के है:

function initialize() { 
    var scope = 'http://docs.google.com/feeds/'; 

    if (google.accounts.user.checkLogin(scope)) { 
     var service = new google.gdata.client.GoogleService('writely', 'DocList-App-v1.0'); 
     service.getFeed(scope + 'documents/private/full/', handleFeed, handleError); 
    } else { 
     var loginButton = $("<button>Click here to login</button>"); 
     loginButton.click(function() { 
      var token = google.accounts.user.login(scope); // can ignore returned token 
     }); 
     $("body").append(loginButton); 
    } 
}; 
​ 
+0

लगभग वहाँ! अब मुझे कॉल 'सेवा पर यह त्रुटि मिल रही है।getFeed': "Uncaught त्रुटि: प्रमाणित पठन और सभी लिखने के लिए इस पृष्ठ पर एक ही डोमेन की एक छवि आवश्यक है।" कोई विचार??? –

+1

@viatropos - आप लगभग वहां हैं। पेज पर कोई भी छवि डालें, लेकिन यह उसी डोमेन पर रहना चाहिए। उदाहरण के लिए, मैंने इस अस्थायी छवि को पृष्ठ पर रखा है और इसे स्टाइलशीट से छुपाया है - ''। – Anurag

+0

अद्भुत! यह वही है जो मैं खोज रहा था, बहुत धन्यवाद अनुराग। –

3

सर्वर पक्ष पर कुछ कोड लिखने पर विचार करें जो प्रॉक्सी के लिए खेलता है और jQuery को कॉल करने देता है।

  • यदि आप PHP का उपयोग कर रहे हैं, तो curl का उपयोग करें।
  • यदि आप जावा का उपयोग कर रहे हैं, तो URLConnection या अधिक संयोजित Apache HttpClient का उपयोग करें।
  • यदि आप सी #/.NET का उपयोग कर रहे हैं, तो WebClient का उपयोग करें।
  • यदि आप रूबी का उपयोग कर रहे हैं, तो Net::HTTP का उपयोग करें।
+0

आप कर सकते हैं। आईई 8 सहित ब्राउज़र के कई नए संस्करणों में क्रॉस-डोमेन XHR समर्थित है। –

+0

@Eli - नहीं, आप मूल रूप से ओपी के तरीके से नहीं कर सकते ... यह "इसका समर्थन करने" का मामला नहीं है, यह सटीक विपरीत है, वे सक्रिय रूप से * सुरक्षा उपाय के रूप में इसे रोक रहे हैं। –

+0

@Eli: मैंने "आप नहीं कर सकते" को हटाने के लिए उत्तर अपडेट किया। यदि आप डाउनवोट को सही करते हैं तो मैं सराहना करता हूं। – BalusC

0

आप कर सकते हैं, जब तक बाहरी डोमेन के लिए एक उपयुक्त Access-Control-Allow-Origin हैडर भेज कर यह अनुमति देता है। फिर केवल ब्राउज़र में XMLHttpRequest API का उपयोग करें जो मानक क्रॉस-डोमेन XHR API और IE में XDomainRequest का समर्थन करता है।

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