2011-04-14 7 views
10

मुझे स्थिति कोड 0 मिलता है ... लेकिन यह कोड 403 है। क्या कोई मुझे बता सकता है कि समस्या क्या है?jqXHR - http-status-code-403 (लेकिन स्थिति कोड 0 है)

jQuery

var jqxhr = $.ajax({ 
     url: 'http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json', 
     dataType: 'json' 
    }).success(function(xhr) { 
     alert(xhr.status); 
    }).error(function(xhr) { 
     alert(xhr.status); 
     return false; 
    }) 

डेमो ->http://jsfiddle.net/QFuBr/

अग्रिम धन्यवाद!
पीटर

+0

अब उपहार देने का एक अच्छा समय होगा। –

उत्तर

17

सर्वर त्रुटि संदेश सूचना की वजह से, एक ब्राउज़र करने के लिए एक 403 त्रुटि देता है, क्योंकि आप संसाधन का उपयोग करने की अनुमति नहीं है ("अनुरोधित उपयोगकर्ता के पसंदीदा सार्वजनिक नहीं कर रहे हैं।")।

हालांकि, सर्वर भी jsFiddle उदाहरण में अनुरोध प्राप्त नहीं करता है।

आपको क्रॉस-ब्राउज़र AJAX अनुरोध करने की अनुमति नहीं है। इसे same-origin policy कहा जाता है। यह सुरक्षा कारणों से है, दुर्भावनापूर्ण कोडर को आपके ज्ञान के बिना अप्रिय चीजें करने से रोकने के लिए। यह एक बदमाश उपकरण है, लेकिन एक प्रभावी है।

जब आप सर्वर से अनुरोध भेजने तक भी नहीं पहुंचते हैं, तो कोई स्थिति कोड नहीं है। यह XMLHTTPRequest ऑब्जेक्ट (और इसके jqXHR wrapper) द्वारा 0 के रूप में रिपोर्ट किया जाता है।

असल में, आप ऐसा नहीं कर सकते जो आप ब्राउज़र में करने का प्रयास कर रहे हैं।

यदि आपको इस तरह के डेटा को असीमित रूप से एक्सेस करने के लिए ब्राउज़र की आवश्यकता है, तो आपको दूरस्थ सर्वर से जानकारी प्राप्त करने और ब्राउज़र पर फ़ीड करने के लिए अपने सर्वर पर एक रैपर लिखना होगा। एक वर्कअराउंड है (इसे जेएसओएनपी – जेडॉन पैडिंग के साथ कहा जाता है) लेकिन मुझे विश्वास नहीं है कि यूट्यूब इसका समर्थन करता है।


संपादित करें: प्रति gradbot's answer, यह jsonp को dataType स्थापित करने के लिए अपने कोड को बदलने के द्वारा एक JSONP अनुरोध करने के लिए संभव है।

हालांकि, अब आप xhr.status का उपयोग करने में सक्षम नहीं होंगे। ऐसा इसलिए है क्योंकि JSONP XHR ऑब्जेक्ट का उपयोग नहीं करता है, इसलिए जांच करने के लिए कोई स्थिति उपलब्ध नहीं है।

Here's a working example using the feed gradbot suggested। ध्यान दें कि परिणाम वस्तु jqXHR ऑब्जेक्ट की बजाय हैंडलर को पास की जाती है।

+0

सही, xhr का उपयोग नहीं किया जाता है और jsonp डोम में एक स्क्रिप्ट तत्व डालने से काम करता है। – gradbot

+1

सीओआरएस (क्रॉस ओरिजिनल रिसोर्स शेयरिंग) अब क्रॉस-डोमेन AJAX अनुरोधों को अनुमति देने के लिए सबसे नए ब्राउज़र द्वारा समर्थित एक विकल्प भी है। Http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing और https://developer.mozilla.org/en-US/docs/HTTP_access_control और http://caniuse.com/#search=cors –

2

आपको dataType: "jsonp" सेट करने की आवश्यकता है और आपको उस उपयोगकर्ता के रूप में लॉग इन करने की आवश्यकता है, जिसे आप पसंदीदा से प्राप्त करने का प्रयास कर रहे हैं। इस मामले में मैं अपना यूजरनेम हथियार का उपयोग करता हूं और अलर्ट सफलता के रूप में वापस आ जाता है।

आप खाते अपने तक पहुँचने के लिए तो API कॉल सामग्री के साथ एक 403 वापस आ जाएगी की कोशिश कर के लिए एक वैध कुकी नहीं है, तो "Favorites of requested user are not public."

$(function() { 
    var jqxhr = $.ajax({ 
     url: 'http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json', 
     dataType: 'jsonp' 
    }).success(function(data, status) { 
     alert(status); 
    }).error(function(xhr) { 
     alert(xhr.status); 
    }) 
}); 
+1

जीता अगर सर्वर इसका समर्थन नहीं करता है तो काम नहीं करेगा! – lonesomeday

+0

यूट्यूब वास्तव में इसका समर्थन करता है। – gradbot

+0

आप यह दिखाना चाहेंगे कि, फिर, क्योंकि [आपके द्वारा सुझाए गए परिवर्तन] (http://jsfiddle.net/QFuBr/1/) चीजों को बेहतर नहीं बनाते हैं। – lonesomeday

0

आप क्रॉस-डोमेन अनुरोध नहीं कर सकते (होना यह अधिकांश आधुनिक ब्राउज़रों में सुरक्षा प्रतिबंधों के कारण प्राप्त या पोस्ट)।

यदि आप अभी भी अन्य डोमेन से डेटा प्राप्त करना चाहते हैं तो एक सर्वर पर स्थापित रिवर्स प्रॉक्सी का उपयोग करने पर विचार करें और सभी अनुरोधों को भेजें। ब्राउज़र के लिए यह अभी भी उसी डोमेन से डेटा की तरह दिखता है।

अपाचे में सबसे लोकप्रिय लोगों में से एक mod_reverse है लेकिन आपके सर्वर के पर्यावरण के आधार पर अन्य विकल्प भी हैं।

यदि Google एपीआई इसका समर्थन करता है तो उपयोगकर्ता JSONP का एक और विकल्प है।

1

403 ऐसा इसलिए है क्योंकि आपको उस उपयोगकर्ता के लिए प्रमाण-पत्र प्रदान करने की आवश्यकता है जिसके वीडियो एक्सेस किए जा रहे हैं। मानते हैं कि सही प्रमाण-पत्र प्रदान किए जाते हैं, अनुरोध अभी भी क्रॉस-डोमेन प्रतिबंधों के कारण विफल हो जाएगा।

ज्यादातर मामलों में, स्थिति कोड 0 का तात्पर्य है कि अनुरोध सर्वर पर नहीं भेजा जा सका। क्रोम कंसोल लॉग आपके बेवकूफ उदाहरण के लिए यहां दिखाए गए हैं।

XMLHttpRequest http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json लोड नहीं कर सकता है। उत्पत्ति http://fiddle.jshell.net को एक्सेस-कंट्रोल-अनुमति-उत्पत्ति द्वारा अनुमति नहीं है।

यूट्यूब, इन-तथ्य all Google Data API's समर्थन JSONP लेकिन यह उपयोग करने के लिए, आप मूल्य json-in-script के साथ एक alt पैरामीटर गुजरती हैं और dataTypejsonp के रूप में निर्दिष्ट करना होगा। jQuery आपके लिए कॉलबैक पैरामीटर की आपूर्ति करेगा। अनुभवजन्य परीक्षण के आधार पर, ऐसा प्रतीत होता है कि यूट्यूब को विशेष रूप से json-in-script होने के लिए alt पैरामीटर की परवाह नहीं है। जब तक callback पैरामीटर निर्दिष्ट किया गया है, alt पैरामीटर केवल json मान ले सकता है।

http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json&callback=foo

यहाँ एक सार्वजनिक रूप से सुलभ फ़ीड के लिए एक working example है।

$.ajax({ 
    url: 'http://gdata.youtube.com/feeds/mobile/videos?alt=json-in-script', 
    dataType: 'jsonp', 
    success: function(data) { 
     // do something with data 
    } 
}); 
संबंधित मुद्दे