2009-12-21 18 views
25

से खाली प्रतिक्रिया टेक्स्ट मैंने एक XMLHttpRequest लिखा है जो ठीक चलता है लेकिन एक खाली प्रतिक्रिया देता है पाठ।XMLHttpRequest

var anUrl = "http://api.xxx.com/rates/csv/rates.txt"; 
    var myRequest = new XMLHttpRequest(); 

    callAjax(anUrl); 

    function callAjax(url) { 
    myRequest.open("GET", url, true); 
    myRequest.onreadystatechange = responseAjax; 
       myRequest.setRequestHeader("Cache-Control", "no-cache"); 
    myRequest.send(null); 
    } 

    function responseAjax() { 
    if(myRequest.readyState == 4) { 
     if(myRequest.status == 200) { 
      result = myRequest.responseText; 
      alert(result); 
      alert("we made it"); 
     } else { 
      alert(" An error has occurred: " + myRequest.statusText); 
     } 
    } 
    } 

कोड ठीक चलाता है:

जावास्क्रिप्ट इस प्रकार है। मैं पैदल चल सकता हूं और मुझे तैयारस्टेट == 4 और एक स्थिति == 200 मिलती है लेकिन प्रतिक्रिया टेक्स्ट हमेशा खाली होता है।

मुझे त्रुटि प्रेषण की लॉग त्रुटि (सफारी डीबग में) मिल रही है: getProperties जिन्हें मैं संदर्भ नहीं ढूंढ सकता।

मैंने स्थानीय और दूरस्थ सर्वर दोनों में सफारी और फ़ायरफ़ॉक्स में कोड चलाया है।

यूआरएल जब एक ब्राउज़र में डाल दिया एक ब्राउज़र में स्ट्रिंग लौटाने और की 200

मैं एक मैक विजेट जो ठीक चलाता है एक ही URL के समान कोड लिखा वाला स्थिति कोड, लेकिन एक ही कोड दे देंगे परिणाम कभी नहीं देता है।

+3

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

उत्तर

25

http://api.xxx.com/ आपके डोमेन का हिस्सा है? यदि नहीं, तो आपको same origin policy द्वारा अवरुद्ध किया जा रहा है।

आप कुछ संभावित समाधानों के लिए निम्नलिखित स्टैक ओवरफ़्लो पोस्ट की जाँच कर सकते हैं:

+0

मुझे एक एहसास था कि यह हो सकता है। इसका गूढ़ पहलू यह है कि मैक विजेट में मैंने XMLHttpRequest को एक ही काम करने के लिए उपयोग किया और यह काम करता है। मुझे लगता है कि विजेट के मामले में मैं ब्राउज़र में नहीं हूं इसलिए अवरुद्ध नहीं हूं। – PurplePilot

+2

वास्तव में इसका एक्सएसएस से कोई लेना देना नहीं है, जो उपयोगकर्ता इनपुट को सत्यापित करने में विफलता के कारण होता है। किसी अन्य डोमेन तक पहुंचने के लिए एक्सएचआर का उपयोग करना मूल उत्पत्ति नीति का उल्लंघन है: http://code.google।कॉम/पी/ब्राउजरैक/विकी/पार्ट 2 – rook

+0

@ द रूक: नोट के लिए धन्यवाद। मेरा जवाब तय किया। –

4

ब्राउज़र क्रॉस-साइट स्क्रिप्टिंग से रोक रहा है।

यदि यूआरएल आपके डोमेन से बाहर है, तो आपको इसे सर्वर के पक्ष में करने या इसे अपने डोमेन में ले जाने की आवश्यकता है।

11

समस्या हल हो गई

मेरे मामले समस्या यह है कि मैं ajax कॉल यूआरएल परम में पूरा पथ साथ ($ .ajax, $ .Get या $ .getJSON jQuery से तरीकों के साथ) करना था :

यूआरएल: "http://mydomain.com/site/cgi-bin/serverApp.php"

लेकिन सही तरीके के रूप में यूआरएल का मूल्य पारित करने के लिए है:

012,

यूआरएल: "साइट/cgi-bin/serverApp.php"

कुछ ब्राउज़र विरोध में नहीं हैं और एक पाठ या किसी अन्य के बीच कोई distiction करते हैं, लेकिन Firefox 3.6 में मैक ओएस के लिए इस ले पूर्ण पथ "क्रॉस साइट स्क्रिप्टिंग" के रूप में ...

http://mydomain.com/site/index.html

और डाल

http://www.mydomain.com/site/index.html

वास्तव में यह सही बिंदु दृश्य है, लेकिन अधिकांश प्रयोगों कोई भेद नहीं करते, इसलिए: एक और बात, एक ही ब्राउज़र में वहाँ एक के बीच अंतर है समाधान अजेक्स अनुरोध और करने वाले तरीकों में स्क्रिप्ट में पूर्ण पथ निर्दिष्ट करने वाले सभी पाठ को निकालना था .... किसी भी को हटाएं MASE index.html फ़ाइल

आधार href = "http://mydomain.com/" < --- खराब विचार, इसे हटाएं!

यदि आप इसे नहीं हटाते हैं, तो इस प्रणाली के लिए ब्राउज़र का यह संस्करण आपका AJAX अनुरोध ले सकता है जैसे कि यह एक क्रॉस साइट अनुरोध है!

मैं एक ही समस्या है, लेकिन केवल मैक ओएस मशीन पर है। समस्या यह है कि फ़ायरफ़ॉक्स किसी भी अन्य मशीन/ब्राउज़र में "ठीक साइट" कॉल के रूप में AJAX प्रतिक्रिया का इलाज करता है, यह ठीक काम करता है। मैं (मुझे लगता है कि एक फ़ायरफ़ॉक्स कार्यान्वयन मुद्दा है) इस बारे में किसी भी मदद नहीं मिला था, लेकिन मैं सर्वर साइड पर अगले कोड साबित करने के लिए जा रहा हूँ: यह सुनिश्चित करें कि ब्राउज़र के रूप में डेटा प्राप्त

header('Content-type: application/json'); 

"json डेटा" ...

+0

प्रतिक्रिया शीर्षलेख जोड़ना सामग्री-प्रकार: एप्लिकेशन/जेसन ने मेरे लिए काम किया। –

1

यह सबसे अच्छा तरीका है यह करने के लिए नहीं हो सकता है। लेकिन यह किसी भी तरह से मेरे लिए काम किया, तो मैं इसके साथ भागने जा रहा हूँ।

मेरे php फ़ंक्शन में डेटा लौटाता है, रिटर्न लाइन से पहले एक पंक्ति, मैं एक गूंज विवरण जोड़ता हूं, जो डेटा भेजना चाहता हूं उसे प्रतिबिंबित करता हूं।

अब सुनिश्चित करें कि यह क्यों काम करता है, लेकिन ऐसा हुआ।

0

आपके लिए एक ही समस्या थी।

Ways to circumvent the same-origin policy

हम यह भी वेब सेवा तरफ thins बदलने के लिए की जरूरत है: क्या हम करना पड़ा document.domain समाधान यहां पाया का उपयोग करें। "पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति" शीर्षक यहां पाया इस्तेमाल किया:

https://developer.mozilla.org/En/HTTP_access_control