XMLHttpRequest स्थिति 0 (responseText खाली है)


104

XMLHttpRequest (स्थिति 0 और प्रतिक्रिया खाली है) के साथ डेटा नहीं मिल सकता है:

xmlhttp = नया XMLHttpRequest ();
xmlhttp.open ("GET", "http://www.w3schools.com/XML/cd_catalog.xml", सच);
xmlhttp.onreadystatechange = function () 
{
  अगर (xmlhttp.readyState == 4)
    चेतावनी ("स्थिति" + xmlhttp.status);
}
xmlhttp.send ();

यह "स्थिति 0" को अलर्ट करता है।

लोकलहोस्ट रिक्वेस्ट के साथ भी यही स्थिति है (cd_catalog.xml को स्थानीय फ़ाइल के रूप में सहेजा गया है)

xmlhttp.open ("GET", "http: //localhost/cd_catalog.xml", सच);

लेकिन लोकलहोस्ट आईपी अनुरोध के साथ

xmlhttp.open ("GET", "http://127.0.0.1/cd_catalog.xml", सच);

और स्थानीय फ़ाइल अनुरोध के साथ

xmlhttp.open ("GET", "cd_catalog.xml", सच);

सब कुछ ठीक है (स्थिति 200)

ऑनलाइन अनुरोध से समस्या (स्थिति = 0) क्या हो सकती है?

पुनश्च: लाइव HTTP हेडर दिखाता है कि सभी 4 मामलों में सब कुछ ठीक है:

  HTTP / 1.1 200 ठीक है
  सामग्री-लंबाई: 4742

PS2: VMWare पर अपाचे स्थानीय वेब सर्वर (होस्ट ओएस विन 7, गेस्ट ओएस उबंटू, नेटवर्क एडेप्टर - एनएटी)। ब्राउज़र - फ़ायरफ़ॉक्स।


1
क्या आपका परीक्षा पृष्ठ http://127.0.0.1किसी भी संयोग से है? ;)
रोआटिन मार्थ

हाँ। <code> 127.0.0.1/CDCatalogTest.html </ code>
arigasa

7
आपने अपने प्रश्न का उत्तर दिया। XMLHttpRequestक्रॉस-डोमेन अनुरोध नहीं कर सकते। हालांकि कुछ वर्कअराउंड हैं। उदाहरण के लिए, jquery को देखें।
meze

फ़ाइल प्राप्त करने के लिए php का उपयोग करें। थोड़ा काम-आस-पास: jquery-howto.blogspot.com/2009/04/…

2
@meze: क्रॉस-डोमेन कॉल jQuery के साथ काम करते हैं। लेकिन जावास्क्रिप्ट में jQuery लागू होने के कारण यह सादे जावास्क्रिप्ट के साथ कैसे काम नहीं कर सकता है? मेरे लिए इसका कोई अर्थ नहीं है। क्या jQuery के किसी प्रकार का गंदा वर्कअराउंड का उपयोग किया जाता है?
ग्रुबर

जवाबों:


55

स्टेटस 0 होता है जब आपकी HTML फाइल जिसमें स्क्रिप्ट होती है, फाइल स्कीम के माध्यम से ब्राउज़र में खोली जाती है। अपने सर्वर में फ़ाइलों को रखने के लिए सुनिश्चित करें (एपाचे या टॉमकैट जो भी हो) और फिर इसे ब्राउज़र में http प्रोटोकॉल के माध्यम से खोलें। (यानी http: //localhost/myfile.html ) यह समाधान है।


1
इसे क्यों ठुकराया जा रहा है? यह वास्तव में सच है! फ़ाइल से XHR अनुरोध: // फ़ाइल के URL भी फ़ाइल पर: // URL में वास्तव में स्थिति == 0 सफलता पर (FF 24.0.5 पर परीक्षण) है।
डैनियल रोएथ्लिसबर्गर

3
मुझे सफारी वर्जन 6.1.6 पर सफलता के साथ स्टेटस == 0 भी मिल रहा है।
प्लैनर

मैं फ़ायरफ़ॉक्स पर लोड अस्थायी ऐड-ऑन का उपयोग करके स्थिति = 0 (लेकिन स्थिति 200 नेटवर्क पर) कर रहा हूं
JobaDiniz

1
अभी भी मान्य उत्तर। वास्तविक दूरस्थ योजनाओं (HTTP एट अल।) और स्थानीय फ़ाइल ( file://योजना) के लिए HTTP प्रतिक्रिया 200 है । जाहिर है, आपको पहले CORS को अक्षम करके स्थानीय फ़ाइल लोड करने की अनुमति देने की आवश्यकता है।
पिड

31

आपकी समस्याओं का कारण यह है कि आप क्रॉस-डोमेन कॉल करने का प्रयास कर रहे हैं और यह विफल हो जाता है

यदि आप लोकलहोस्ट डेवलपमेंट कर रहे हैं तो आप क्रॉस-डोमेन कॉल कर सकते हैं - मैं यह हर समय करता हूं।

फ़ायरफ़ॉक्स के लिए, आपको इसे अपनी कॉन्फ़िगरेशन सेटिंग्स में सक्षम करना होगा

signed.applets.codebase_principal_support = true

फिर अपने XHR ओपन कोड में कुछ इस तरह जोड़ें:

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

IE के लिए, अगर मुझे सही याद है, तो आपको केवल ActiveX XHRs के साथ काम करने के लिए ब्राउज़र की सुरक्षा सेटिंग को "विविध → डोमेन पर पहुँच डेटा स्रोतों" के तहत सक्षम करना होगा।

IE8 और इसके बाद के संस्करण में देशी XmlHttpRequest ऑब्जेक्ट्स में क्रॉस-डोमेन क्षमताओं को भी जोड़ा गया है, लेकिन मैंने अभी तक उन लोगों के साथ नहीं खेला है।


8
यदि किसी को इसकी आवश्यकता है, तो Chrome के लिए आपको इसका एक नया उदाहरण लॉन्च करना होगा (बिना किसी पहले से खुले) और उपयोग करें--allow-file-access-from-files
TheZ

@ THEZ: क्या आप 100% हैं? मैंने सुना है कि आपको केवल --allow-file-access-from-filesस्विच के साथ क्रोम के नए इंस्टेंस को चलाने की आवश्यकता है , लेकिन आपको अन्य सभी रनिंग इंस्टेंसेस को बंद करने की आवश्यकता नहीं हैChrome Incognito Mode के मामले में बिल्कुल पसंद है - आप इसका उपयोग कर सकते हैं, बिना किसी अन्य चल रहे इंस्टेंस के।
ट्रेडर

ऐसा लगता है कि 'UniversalBrowserRead' के लिए समर्थन को गिरा दिया गया है, इसलिए यह काम आसपास का विकल्प नहीं है।
पेरिंडलमिशप

साथ ही, यह तब हो सकता है जब आप http पेज से https पेज (जैसे-ब्राउज़र एक्सटेंशन) का अनुरोध कर रहे हों।
सिबविक

Html पेज और AJAX स्क्रिप्ट एक ही डोमेन में रहने के बावजूद , मैं इस समस्या का सामना कर रहा हूँ । लेकिन अजीब तरह से, यह केवल कुछ लिपियों को प्रभावित कर रहा है , विशेष रूप से कोई भी स्क्रिप्ट जो MongoDB संसाधनों का उपयोग करती है। यह क्यों है के रूप में कोई सुराग?
डेविड एडवर्ड्स

26

वास्तव में सुनिश्चित करें कि आपका बटन प्रकार बटन सबमिट नहीं है, जिससे स्थिति संघर्ष पैदा हो गया है जहां मैं हाल ही में मिला था।


1
कोई विरोध है क्योंकि फ़ॉर्म सबमिट करने से कुछ डिफ़ॉल्ट व्यवहार होता है जिसे आपको रोकने की आवश्यकता होती है यदि आप घटना को संभाल रहे हैं और अपने आप को एक अजाक्स बना रहे हैं। आप अपने हैंडलर और कॉलिंग में घटना को रोककर डिफ़ॉल्ट व्यवहार को रोक सकते हैंe.preventDefault()
जॉर्डन

20

यदि सर्वर एक ऑप्‍शन विधि पर प्रतिक्रिया देता है और जीईटी और पोस्‍ट (उनमें से जो भी आप उपयोग कर रहे हैं) एक हेडर के साथ:

Access-Control-Allow-Origin: *

यह ठीक काम कर सकता है। FireFox 3.5 और rekonq 0.4.0 में लगता है। जाहिर है, उस हेडर और विकल्प के लिए प्रारंभिक प्रतिक्रिया के साथ, सर्वर ब्राउज़र से कह रहा है, "आगे बढ़ो और इस क्रॉस-डोमेन अनुरोध को गुजरने दो।"


3
यह सही जवाब है! अधिक जानकारी के लिए en.wikipedia.org/wiki/Cross-origin_resource_sharing देखें । यदि आप इस शीर्ष लेख को जोड़ते हैं, तो यह 'काम नहीं' हो सकता है, लेकिन 'काम करेगा'। NB आपको जो कुछ भी जोड़ने की आवश्यकता है वह एक HTTP / response / हैडर है - इसलिए आप इसे केवल एक सर्वर पर कर सकते हैं जिसे आप नियंत्रित करते हैं। यह संभव नहीं होगा कि सीधे w3schools.com/XML/cd_catalog.xml का उपयोग करें XMLHttpRequest(यानी मूल प्रश्न के अनुसार), क्योंकि वह संसाधन (कम से कम, 24 अप्रैल 2015 तक) ऐसे किसी भी CORS हैडर को शामिल नहीं करता है।
माइक बीटन

13

अनुरोध टाइमआउट पर भी विचार करें :

आधुनिक ब्राउजर रेडीस्टेट = 4 और एस टैटस = 0 लौटाता है, यदि सर्वर की प्रतिक्रिया से पहले बहुत अधिक समय गुजर जाता है।


3
@AndreaSavojardo: क्या आपका कोई संदर्भ है (एमडीएन पर एक पोस्ट की तरह) क्या यह व्यवहार मानकों का अनुपालन करता है?
अलेक्जेंडर अबाकुमोव

@AndreaSavojardo मेरे पास तैयार है = 4 और स्थिति = 0 और सर्वर नहीं चल रहा है लेकिन त्रुटि का अलर्ट मुझे तेजी से दिखाया गया है .... "रिक्वेस्ट टाइम आउट" के लिए कितना समय बीतता है?

7

setRequestHeader("Access-Control-Allow-Origin","*")अपनी सर्वर प्रतिक्रिया में जोड़ें ।


3

मैंने इसी तरह की समस्या का सामना किया था। हर चीज़ ठीक थी, "रेडीसैट" 4 था, लेकिन "स्टेटस" 0. था क्योंकि मैं अपाचे PHP पोर्टेबल सर्वर और अपनी फ़ाइल का उपयोग कर रहा था जिसमें मैंने "XMLHttpRequest" ऑब्जेक्ट का उपयोग किया था एक html फ़ाइल थी। मैंने फ़ाइल एक्सटेंशन को php में बदल दिया और समस्या हल हो गई।


3

जावास्क्रिप्ट कंसोल खोलें । आपको वहां एक त्रुटि संदेश दिखाई देगा। मेरे मामले में यह कोर था।


2

क्यों नहीं http://127.0.0.1/cd_catalog.xmlकाम करता है के सवाल का जवाब देने के लिए http://localhost/cd_catalog.xml: फ़ायरफ़ॉक्स 127.0.0.1 और दो अलग-अलग डोमेन के रूप में लोकलहोस्ट का इलाज कर रहा है।


2

यह देखने के लिए कि समस्या क्या है, जब आपको गुप्त त्रुटि 0 प्राप्त होती है ... | अधिक उपकरण | Chrome में डेवलपर टूल (Ctrl + Shift + I) (त्रुटि देने वाले पृष्ठ पर)

सही त्रुटि संदेश प्राप्त करने के लिए लॉग में लाल पाठ पढ़ें। यदि वहाँ बहुत कुछ है, राइट-क्लिक करें और कंसोल को साफ़ करें, तो अपना अंतिम अनुरोध फिर से करें।

मेरी पहली समस्या थी, मैं पहली बार ब्राउज़र के लिए अपने स्वयं के क्रॉस-डोमेन वेब सेवा के लिए प्राधिकरण हेडर में जा रहा था।

मेरे पास पहले से ही था:

Access-Control-Allow-Origin: *

लेकिन नहीं:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization

मेरी वेब सेवा की प्रतिक्रिया हैडर में।

जब मैंने यह जोड़ा, उसके बाद, मेरी त्रुटि शून्य मेरे स्वयं के वेब सर्वर से चला गया, साथ ही जब एक वेब सर्वर के बिना स्थानीय रूप से index.html फ़ाइल चला रहा था, लेकिन फिर भी कोड पेन में त्रुटियां दे रहा था।

वापस ... | अधिक उपकरण | कोडपेन में त्रुटि प्राप्त करते समय डेवलपर टूल, और स्पष्ट रूप से समझाया गया है: कोडपैड https का उपयोग करता है, इसलिए मैं HTTP पर कॉल नहीं कर सकता, क्योंकि सुरक्षा कम है।

इसलिए मुझे अपनी वेब सेवा को https पर होस्ट करने की आवश्यकता है।

यह जानकर कि सच्चा त्रुटि संदेश कैसे मिलता है - अनमोल!


मैंने इस दृष्टिकोण (क्रोम में f12) का उपयोग किया और मुझे पता चला कि मैं https से http तक जाने की कोशिश कर रहा था जो चुपचाप बिना किसी उपयोगी चीज के विफल हो रहा था। त्रुटि संदेश: VM1152: 1 मिश्रित सामग्री: इस पृष्ठ को 'https://mysiteoriginsite' HTTPS पर लोड किया गया था, लेकिन एक असुरक्षित XMLHttpRequest समापन बिंदु का अनुरोध किया 'http://MyDestinationSite/MyService.svc'। इस अनुरोध को अवरुद्ध कर दिया गया है; सामग्री को HTTPS पर परोसा जाना चाहिए।
ग्रेवार्फ

1

यहाँ एक और मामला है, जिसमें status === 0अपलोड करने के लिए विशिष्ट है:

यदि आप एक 'load'इवेंट हैंडलर संलग्न करते हैं XHR.upload, जैसा कि एमडीएन द्वारा सुझाया गया है ('मॉनीटरिंग प्रगति' के अपलोड भाग पर स्क्रॉल करें), एक्सएचआर ऑब्जेक्ट होगा status=0और अन्य सभी गुण खाली स्ट्रिंग होंगे। यदि आप 'load'हैंडलर को सीधे एक्सएचआर ऑब्जेक्ट में संलग्न करते हैं , जैसा कि आप सामग्री डाउनलोड करते समय करते हैं, तो आपको ठीक होना चाहिए (यह देखते हुए कि आप बस्टहोस्ट को बंद नहीं कर रहे हैं)।

हालाँकि, यदि आप अपने 'progress'ईवेंट हैंडलर में अच्छा डेटा प्राप्त करना चाहते हैं, तो आपको एक्सएचआर ऑब्जेक्ट पर सीधे ही नहींXHR.upload , बल्कि हैंडलर संलग्न करना होगा।

मैंने केवल क्रोम OSX पर अब तक इसका परीक्षण किया है, इसलिए मुझे यकीन नहीं है कि यहाँ एमडीएन के प्रलेखन में कितनी समस्या है और क्रोम का कार्यान्वयन कितना है ...


1

एलेक्स रॉबिन्सन पहले से ही (और पहले) इस मुद्दे का सही जवाब देता है। लेकिन इसे थोड़ा और विस्तृत करने के लिए ...

आपको HTTP प्रतिसाद शीर्ष लेख जोड़ना होगा:

Access-Control-Allow-Origin: *

यदि आप ऐसा करते हैं, तो परिणाम केवल 'काम नहीं' हो सकता है, लेकिन 'काम करेगा'।

NB आपको जो कुछ भी जोड़ने की आवश्यकता है वह एक HTTP प्रतिक्रिया हैडर है - इसलिए आप इसे केवल एक सर्वर पर कर सकते हैं जिसे आप नियंत्रित करते हैं। Http://w3schools.com/XML/cd_catalog.xml को सीधे अपने मूल URL से प्राप्त करना संभव नहीं होगा XMLHttpRequest(ओपी के प्रश्न के अनुसार), क्योंकि वह संसाधन (कम से कम, 24 अप्रैल 2015 तक नहीं) ऐसे किसी भी CORS हेडर को शामिल करें।

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing अधिक जानकारी देता है।


0

इस तरह की मेरी समस्या मेरे html कोड की जाँच करके हल की गई थी। मैं onclickअपने फॉर्म सबमिट बटन को एक विधि में हैंडलर कर रहा था । इस तरह onclick="sendFalconRequestWithHeaders()":। बदले में यह विधि आपकी तरह ही अजाक्स को बुलाती है, और वही करती है जो मुझे चाहिए। लेकिन उम्मीद के मुताबिक नहीं, मेरा ब्राउज़र कुछ भी नहीं लौटा रहा था।

किसी की कड़ी मेहनत से सीखा , मैं इस हैंडलर में झूठे लौटा हूं, और हल किया है। बता दें कि इस पद पर पहुंचने से पहले, मैंने ऑफिस लेखन कोड को लागू करने में CORS filters, पूरे 3 दिन का वीकेंड और आधा दिन बिताया है jetty config, अन्य jersey and embedded jettyसंबंधित सामान - बस इसे ठीक करने के लिए।, मेरी सभी समझ को चारों ओर cross domain ajax requestsऔर मानकों को सामान में बदलते हुए। यह बहुत हास्यास्पद था कि जावास्क्रिप्ट में सरल गलतियाँ आपको कैसे गूंगा बनाती हैं।

सच कहूं, तो मैंने कोशिश की है signed.applets.codebase_principal_support = trueऔर लिखा है isLocalHost() **if**। हो सकता है कि यह तरीका हमारे द्वारा लागू किया जाना चाहिए, फ़ायरफ़ॉक्स का कहना है कि ऐसा कोई नहीं है अब मुझे अपने कोड को साफ-सफाई से जमा करने के लिए साफ़ करना होगा। किसी को धन्यवाद।


0

एक ब्राउज़र अनुरोध "127.0.0.1/somefile.html" स्थानीय वेबसर्वर पर अपरिवर्तित आता है, जबकि "स्थानीयहोस्ट / somefile.html" "0: 0: 0: 0: 0: 0: 0: 0: 1 या somefile.html के रूप में आ सकता है। "अगर IPv6 समर्थित है। तो बाद वाले को एक डोमेन से दूसरे में जाने के रूप में संसाधित किया जा सकता है।


0

एलेक्स रॉबिन्सन और bmju ने क्रॉस-मूल मुद्दों को समझने के लिए बहुमूल्य जानकारी प्रदान की। मैं यह जोड़ना चाहता था कि वांछित GET / POST बनाने से पहले आपको अपने ग्राहक कोड में एक स्पष्ट विकल्प कॉल करने की आवश्यकता हो सकती है (जैसे एक CORS OAuth सेवा समापन बिंदु के खिलाफ)। आपका ब्राउज़र / पुस्तकालय स्वतः विकल्प अनुरोध को संभाल नहीं सकता है। ग्रुबर, यह आपके प्रश्न के संभावित उत्तरों में से एक है।


0

मुझे एक ही समस्या थी (रेडीस्टेट 4 और स्टेटस 0 था) , तब मैंने इस ट्यूटोरियल में बताए गए एक अलग दृष्टिकोण का अनुसरण किया: https://spring.io/guides/gs/consuming-rest-jquery/

उन्होंने XMLHttpRequest का उपयोग बिल्कुल नहीं किया , इसके बजाय उन्होंने jquery $ .ajax () विधि का उपयोग किया:

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="hello.js"></script>
</head>

<body>
    <div>
        <p class="greeting-id">The ID is </p>
        <p class="greeting-content">The content is </p>
    </div>
</body>

और सार्वजनिक / hello.js फ़ाइल के लिए (या आप इसे सीधे उसी HTML कोड में सम्मिलित कर सकते हैं):

$(document).ready(function() 
 {
    $.ajax({
        url: "http://rest-service.guides.spring.io/greeting"
   }).then(function(data) {
      $('.greeting-id').append(data.id);
      $('.greeting-content').append(data.content);
   });
 });

2
तुम्हें पता है कि jQuery अंदर पर $.ajax()उपयोग करता XMLHttpRequestहै, क्या तुम नहीं?
मन्नोजो


-1

मेरे पास बस यह मुद्दा था क्योंकि मैंने 0.0.0.0अपने सर्वर के रूप में उपयोग किया , इसे बदल दिया localhostऔर यह काम करता है।


-4

संपादित करें: कृपया मालवोलियो की टिप्पणियों को पढ़ें क्योंकि इस उत्तर का ज्ञान पुराना है।

आप क्रॉस-डोमेन XMLHttpRequests नहीं कर सकते।

127.0.0.1आपके परीक्षण पृष्ठ पर स्थित होने के कारण कॉल कार्य करता है 127.0.0.1, और स्थानीय परीक्षण भी कार्य करता है, ठीक है ... यह एक स्थानीय परीक्षण है।

अन्य दो परीक्षण विफल हो जाते हैं क्योंकि जावास्क्रिप्ट XMLHttpRequest के माध्यम से दूर के सर्वर से संवाद नहीं कर सकता है।

आप इसके बजाय या तो विचार कर सकते हैं:

  • XMLHttp-request आपके अपने सर्वर को आपके लिए दूरस्थ XML सामग्री लाने के लिए (php स्क्रिप्ट, उदाहरण के लिए)
  • यदि आप इसे पूर्ण जावास्क्रिप्ट रखना चाहते हैं तो GoogleAppEngine जैसी सेवा का उपयोग करने की कोशिश कर रहा है।

उम्मीद है की वो मदद करदे


40
यह सिर्फ गलत है। आप क्रॉस-डोमेन XMLHttpRequests कर सकते हैं।
मालवियो

1
"आप नहीं कर सकते" के रूप में "आप इसे नहीं करना चाहिए क्योंकि यह एक अच्छा विचार नहीं है"
गेब्रियल स्प्रेंजर

24
- काफी उचित है, लेकिन मुझे नहीं पता कि कोई टिप्पणी इसके लिए सबसे अच्छा मंच है। क्रॉस-डोमेन XMLHttpRequests में निश्चित रूप से कुछ सुरक्षा चुनौतियां हैं, लेकिन वे उन चुनौतियों से निपटने के लिए आवश्यक सभी उपकरण प्रदान करते हैं। इसके अलावा, वे वेबसाइटों को आसानी से अन्य वेबसाइटों को सेवाएं प्रदान करने की अनुमति देते हैं, सीडीएन का उपयोग करने के लिए डेटा का प्रचार करने के लिए, और उपयोगकर्ता के अनुरोधों के लिए और अधिक तेज़ी से प्रतिक्रिया करने के लिए। यदि आपके कोई विशिष्ट प्रश्न हैं, तो आप मुझे संदेश भेज सकते हैं या बेहतर कर सकते हैं, तो SO पर यहां एक प्रश्न पोस्ट करें और उस पर मेरा ध्यान आकर्षित करें।
मालवोलियो

2
@GabrielSprenger: क्रॉस-डोमेन XMLHttpRequests केवल एक अच्छा विचार नहीं है, यह आजकल बहुत आम है कि उन्हें आधुनिक वेब ऐप में नहीं किया जा रहा है (कुछ तरह के HelloWorlds से परे) कुछ हास्यास्पद है। आपके एप्लिकेशन द्वारा खपत की जाने वाली किसी भी बाहरी REST सेवा को क्रॉस-डोमेन की आवश्यकता होती है XMLHttpRequest। और यही कारण है कि सभी कि कोर सामग्री जोड़ा गया था।
अलेक्जेंडर अबाकुमोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.