jQuery: $ .ajax.error पद्धति के भीतर से HTTP स्थिति कोड कैसे प्राप्त करें?


81

मैं AJAX अनुरोध करने के लिए jQuery का उपयोग कर रहा हूं। मैं अलग-अलग क्रिया करना चाहता हूं चाहे HTTP स्थिति कोड 400 त्रुटि हो या 500 त्रुटि। इसे कैसे प्राप्त किया जा सकता है?

$.ajax({
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data){
        alert('horray! 200 status code!');
    },
    error: function(data){
        //get the status code
        if (code == 400) {
            alert('400 status code! user error');
        }
        if (code == 500) {
            alert('500 status code! server error');
        }
    },
});

अपडेट करें:

@GeorgeCummins ने कहा कि यह प्रतिक्रिया शरीर के साथ काम करने के लिए "अजीब लग रहा था"। यह पहली बार है जब मैंने इस तरह की कोशिश की है। क्या मेरा दृष्टिकोण एक सर्वोत्तम अभ्यास नहीं है? आप क्या सुझाव देंगे? मैंने इसके लिए एक और StackOverflow प्रश्न बनाया है: उपयोगकर्ता / प्रपत्र सत्यापन त्रुटि होने पर मुझे AJAX अनुरोध के लिए क्या प्रतिक्रिया / स्थिति कोड भेजना चाहिए?

जवाबों:


102

यदि आप jQuery 1.5 का उपयोग कर रहे हैं, तो statusCodeकाम करेगा।

यदि आप jQuery 1.4 का उपयोग कर रहे हैं, तो यह कोशिश करें:

error: function(jqXHR, textStatus, errorThrown) {
    alert(jqXHR.status);
    alert(textStatus);
    alert(errorThrown);
}

आपको पहली चेतावनी से स्थिति कोड देखना चाहिए।


1
ओह, मैं अपनी समस्या देखता हूं। मैं सोच रहा था कि dataत्रुटि विधि को पारित किया जा रहा है, लेकिन यह वास्तव jqXHRमें है textStatus, औरerrorThrown
एंड्रयू

5
मुझे आपका उत्तर पसंद है क्योंकि आपने jQuery के विभिन्न संस्करणों के बीच अंतरों का उल्लेख किया है, जिन्हें मैंने पहले नोटिस नहीं किया था।
एंड्रयू

2
मैं आपके उदाहरण का उपयोग jQ 2.x पर कर रहा हूं और स्थिति हमेशा शून्य (0) है, टेक्स्टस्टैटस हमेशा 'एरर' और एररथ्रोवन खाली है। कोई विचार? मैंने क्या किया है: पृष्ठ के लोड होने के बाद सर्वर का पता लगाना कि क्या होता है।
कोडबीट

मेरे लिए यह तब काम आया जब मुझे स्टेटस कोड 419 मिला और मैं त्रुटि को संभाल सकता था।
दिशा

61

आपको statusCodeसेटिंग का उपयोग करके क्रियाओं का मानचित्र बनाना चाहिए :

$.ajax({
  statusCode: {
    400: function() {
      alert('400 status code! user error');
    },
    500: function() {
      alert('500 status code! server error');
    }
  }
});

संदर्भ (स्क्रॉल करें: 'स्टेटसकोड')

EDIT (टिप्पणियों के जवाब में)

यदि आपको प्रतिक्रिया निकाय में दिए गए डेटा (जो मुझे अजीब लगता है) के आधार पर कार्रवाई करने की आवश्यकता है, तो आपको error:इसके बजाय उपयोग करने की आवश्यकता होगीstatusCode:

error:function (xhr, ajaxOptions, thrownError){
    switch (xhr.status) {
        case 404:
             // Take action, referencing xhr.responseText as needed.
    }
} 

मैंने उस मार्ग को शुरू कर दिया, लेकिन यह पता नहीं लगा सका कि डेटा कैसे प्राप्त किया जाए। आप प्रतिक्रिया निकाय का उपयोग कैसे करते हैं?
एंड्रयू

@ और पूछा: आपको प्रतिक्रिया निकाय तक पहुंचने की आवश्यकता क्यों है? क्या आप 400 या 500 त्रुटि होने पर उपयोगी डेटा वापस आने की उम्मीद कर रहे हैं?
जॉर्ज कमिंस

हां, मैं फॉर्म सत्यापन त्रुटियों के लिए 400 का स्टेटस कोड इस्तेमाल कर रहा हूं। (निश्चित नहीं है कि यह उपयुक्त है या नहीं)
एंड्रयू

उस स्थिति में, क्या आप के शरीर में उपयुक्त प्रपत्र सत्यापन कार्रवाई कर सकते हैं 400: function() {। बस अलर्ट हटा दें () और आवश्यक कोड जोड़ें।
जॉर्ज कमिंस

प्रतिक्रिया शरीर में त्रुटि संदेशों का HTML होता है। मैं अनुरोध निकाय को भीतर से कैसे एक्सेस कर सकता हूं 400: function() {?
एंड्रयू

10

एक अन्य समाधान response.status फ़ंक्शन का उपयोग करना है। यह आपको http स्टेटस विच देगा जो ajax कॉल द्वारा दिया गया है।

function checkHttpStatus(url) {     
    $.ajax({
        type: "GET",
        data: {},
        url: url,
        error: function(response) {
            alert(url + " returns a " + response.status);
        }, success() {
            alert(url + " Good link");
        }
    });
}

8

उपयोग

   statusCode: {
    404: function() {
      alert('page not found');
    }
  }

-

$.ajax({
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data){
        alert('horray! 200 status code!');
    },
    statusCode: {
    404: function() {
      alert('page not found');
    },

    400: function() {
       alert('bad request');
   }
  }

});

2
आप एक अप्रत्याशित स्थिति कैसे पकड़ेंगे, क्या सिंटैक्स के इस संस्करण में कोई कैच-ऑल या हैंडलर है?
joedotnot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.