2011-03-17 10 views
6

मैं एक ऐसा एप्लिकेशन लागू कर रहा हूं जो एक जावास्क्रिप्ट क्लाइंट और सर्वर के बीच संचार पर निर्भर करता है जो जानता है कि JSONP नोटेशन का उपयोग कर क्लाइंट को कैसे प्रतिक्रिया देना है।जावास्क्रिप्ट में JSONP प्रतिक्रिया को पार्स करना जब 4xx या 5xx एचटीपी त्रुटि कोड मौजूद है

मैं अपने जावास्क्रिप्ट क्लाइंट में केस को संभालने का प्रयास कर रहा हूं जहां मेरा सर्वर 4xx या 5xx के http स्टेटस कोड के साथ लौटाता है। वर्तमान में जो मैं देख रहा हूं वह यह है कि स्क्रिप्ट का मूल्यांकन नहीं किया जाता है क्योंकि ब्राउज़र का मानना ​​है कि यह एक त्रुटि है (जो यह है।) हालांकि, मैं अभी भी पढ़ना चाहता हूं कि इस सर्वर को 4xx या 5xx प्रतिक्रिया की स्थिति में क्या कहना है मेरे जावास्क्रिप्ट क्लाइंट में कोड।

मुझे लगता है कि यह स्क्रिप्ट टैग तत्व पर एक त्रुटि उत्पन्न करता है, लेकिन मुझे चिंता है कि यह क्रॉस ब्राउज़र नहीं है और यह एक मजबूत समाधान नहीं होगा।

क्या किसी को भी किसी भी जेएसपीपी प्रतिक्रिया को पार्स करने पर कोई भाग्य है, भले ही http स्थिति कोड 4xx या 5xx है?

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

संपादित करें: जब मेरा सर्वर एक jsonp क्लाइंट का पता लगाता है और फिर जेसन ऑब्जेक्ट में त्रुटि संदेश/स्थिति को सुरंग करता है तो मैं अस्थायी रूप से 200 स्थिति कोड वापस कर रहा हूं। मैं HTTP स्टेटस कोड का लाभ लेने की उम्मीद कर रहा था लेकिन मुझे लगता है कि जावास्क्रिप्ट क्लाइंट के लिए जाना नहीं है।

उत्तर

7

JSONP का उपयोग करते समय एक दृष्टिकोण कॉलबैक में स्थिति जानकारी एम्बेड करना है। तो कॉलबैक फ़ंक्शन हस्ताक्षर की तरह

callback(result, status, message) 

तो लगेगा अपने कॉल की तरह

http://myurl.com/?callback=fn 

लग रहा है अगर एक सफल कॉल कि

fn({"data":"my great data"}, 200) 

की तरह और एक असाधारण हालत

के लिए लग रहा है के लिए कोड उत्पन्न
fn(null, 500, "server error"} 
+0

लुमेन/लार्वेल परियोजना का उपयोग करके इसे कैसे प्राप्त किया जा सकता है इस पर कोई विचार? – jtanmay

-3

आप एक्सएचआर ऑब्जेक्ट के status (यदि आप जेएस लाइब्रेरी का उपयोग नहीं कर रहे हैं) की जांच कर सकते हैं।

if(xhr.readyState == 4){ 
    if(xhr.status == 200){ 
    // good 
    }else if(xhr.status == 502){ 
    // d'oh 
    } 
} 

आप jQuery का उपयोग कर रहे हैं, तो आप एक statusCode में पास के लिए $.ajax

+1

मैं usin हूँ जी JSONP पार डोमेन प्रतिबंधों को बाईपास करने के लिए। http://en.wikipedia.org/wiki/JSON#JSONP धारा 8।1 –

+1

@ मैसी ऐसा लगता है कि मुझे कुछ नींद की जरूरत है: पी वैसे भी, एक समान चर्चा है [यहां] (http://stackoverflow.com/questions/1002367/jquery-ajax-jsonp-ignores-a-timeout-and-doesnt- आग-त्रुटि घटना)। – Haochi

+0

शांत, उस लिंक के लिए धन्यवाद –

8

JSONP विशेष मामलों को संभालने के लिए कर सकते हैं काम के आसपास करने के लिए क्रॉस-डोमेन मुद्दों पर एक हैक है। जब यह काम करता है, यह अच्छी तरह से काम करता है। लेकिन जब आपके पास यह पता लगाने का कोई तरीका नहीं है कि क्या गलत हुआ।

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

यदि आप सर्वर को नियंत्रित करते हैं, तो क्रॉस डोमेन अनुरोधों को अनुमति देने के लिए क्रॉस-ओरिजिन-रिसोर्स-शेयरिंग (सीओआरएस), या फ्लैश के crossdomain.xml जैसे विकल्पों का उपयोग करने का प्रयास करें। यदि आप सर्वर को नियंत्रित नहीं करते हैं, तो आप बेहतर नियंत्रण प्राप्त करने के लिए अपने सर्वर के माध्यम से प्रतिक्रिया को प्रॉक्सी कर सकते हैं।

+0

क्या सीओआरएस के लिए क्रॉस ब्राउज़र समर्थन की कमी आपकी राय में एक महत्वपूर्ण समस्या है? http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing –

+1

यह एक महत्वपूर्ण समस्या है, लेकिन ऐसे सभी अन्य समाधान भी हैं। सीओआरएस अधिकांश नए ब्राउज़रों (मोबाइल सफारी समेत) पर काम करता है, लेकिन पुराने ब्राउज़र पर काम नहीं करता है। फ्लैश डेस्कटॉप पर सार्वभौमिक है, लेकिन मोबाइल उपकरणों पर काम नहीं करता है। सर्वर-साइड प्रॉक्सी हर जगह काम करता है, लेकिन अतिरिक्त काम की ज़रूरत है। JSONP में त्रुटि प्रबंधन नहीं है। बुराइयों का कम चुनें। –

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