अजाक्स अनुरोध 200 ठीक देता है, लेकिन सफलता के बजाय एक त्रुटि घटना निकाल दी जाती है


805

मैंने अपनी वेबसाइट पर एक अजाक्स अनुरोध लागू किया है, और मैं एक वेबपेज से समापन बिंदु कह रहा हूं। यह हमेशा 200 ठीक देता है , लेकिन jQuery त्रुटि घटना को अंजाम देता है।
मैंने बहुत सी चीजों की कोशिश की, लेकिन मैं इस समस्या का पता नहीं लगा सका। मैं नीचे अपना कोड जोड़ रहा हूं:

jQuery कोड

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

C # कोड के लिए JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

मुझे ("Record deleted")सफल विलोपन के बाद स्ट्रिंग की आवश्यकता है । मैं सामग्री को हटाने में सक्षम हूं, लेकिन मुझे यह संदेश नहीं मिल रहा है। क्या यह सही है या मैं कुछ गलत कर रहा हूं? इस मुद्दे को हल करने का सही तरीका क्या है?


2
क्या आप JSON सत्यापनकर्ता के माध्यम से JqueryOperation.aspx का आउटपुट चला सकते हैं और देख सकते हैं कि क्या यह JSON मान्य है
parapura rajkumar

1
Jsonlint.com की तरह । आपको अपने द्वारा भेजे गए मापदंडों की भी जाँच करनी होगी। वर्तमान में आपने कोई पैरामीटर नाम सेट नहीं किया है। यदि पैरामीटर है TwitterId, तो आपको एक ऑब्जेक्ट पास करना होगा data, न कि एक स्ट्रिंग data: {TwitterId: row}:।
फेलिक्स क्लिंग

6
क्या Jqueryoperation.aspx पेज रिटर्न (वैध) JSON है?
सलमान एक

1
शायद आपका सर्वर साइड कोड एक अपवाद को फेंक रहा है .. प्रतिक्रिया के रूप में आपके कैच ब्लॉक में क्या बर्बाद हो रहा है?
राघव

3
@ राघव, अगर सर्वर ने अनुरोध को संसाधित करने वाले अपवाद को फेंक दिया, तो HTTP रिटर्न कोड 500 होगा।
स्टुपरुसर

जवाबों:


1118

jQuery.ajaxनिर्दिष्ट dataTypeपैरामीटर या Content-Typeसर्वर द्वारा भेजे गए हेडर के आधार पर प्रतिक्रिया निकाय को परिवर्तित करने का प्रयास करता है । यदि रूपांतरण विफल रहता है (जैसे कि JSON / XML अमान्य है), तो त्रुटि कॉलबैक निकाल दिया जाता है।


आपके AJAX कोड में शामिल हैं:

dataType: "json"

इस मामले में jQuery:

JSON के रूप में प्रतिक्रिया का मूल्यांकन करता है और जावास्क्रिप्ट ऑब्जेक्ट लौटाता है। […] JSON डेटा एक सख्त तरीके से पार्स किया गया है; किसी भी विकृत JSON को अस्वीकार कर दिया जाता है और एक पार्स त्रुटि डाली जाती है। […] एक खाली प्रतिक्रिया भी अस्वीकार कर दी गई है; सर्वर को इसके बजाय रिक्त या {} की प्रतिक्रिया वापस करनी चाहिए।

आपका सर्वर-साइड कोड 200 OKस्टेटस के साथ HTML स्निपेट लौटाता है । jQuery वैध JSON की उम्मीद कर रहा था और इसलिए त्रुटि कॉलबैक की शिकायत करता है parseerror

समाधान dataTypeअपने jQuery कोड से पैरामीटर को निकालने और सर्वर-साइड कोड रिटर्न बनाने के लिए है:

Content-Type: application/javascript

alert("Record Deleted");

लेकिन मैं यह सुझाव देना चाहूंगा कि JSON प्रतिक्रिया लौटाएं और सफलता कॉलबैक के अंदर संदेश प्रदर्शित करें:

Content-Type: application/json

{"message": "Record deleted"}

1
आपकी प्रतिक्रिया के लिए धन्यवाद, आप मुझे एक बात बता सकते हैं कि मैं कोड से पीछे से json मान कैसे लौटा सकता हूं। मैं C के साथ Asp.net का उपयोग कर रहा हूं। इससे मेरी समस्या हल हो गई लेकिन कृपया मुझे यह बात भी बताएं।
पंकज मिश्रा

1
@ पंकज: अगर आप इसे दूसरे प्रश्न के रूप में पोस्ट करते हैं तो बेहतर है। लेकिन संक्षिप्त जवाब: ऐसा करने के दो तरीके (i) आपके बजाय $.ajaxकोशिश कर सकते हैं $.getScript। सर्वर साइड C # स्क्रिप्ट के अंदर alert('Record Deleted');(कोई <script>टैग नहीं ) डालें और अपनी C # स्क्रिप्ट का ContentType सेट करें text/javascript$.ajaxकाम भी हो सकता है लेकिन मैं याद नहीं कर सकता कि कैसे, आपको सिर्फ बदलने की आवश्यकता हो सकती है dataType: 'script',। हो सकता है कि अब आपको सफलता के हैंडलर की आवश्यकता न हो।
सलमान ए

3
यह उत्तर पूर्ण नहीं हो सकता है। अभी-अभी मैंने jSONlint.com पर अपने JSON को मान्य किया, यह स्पष्ट रूप से कहता है कि यह एक vaild json है, लेकिन फिर भी "त्रुटि" घटना को निकाल दिया जाता है, xhr.status 200 के साथ। इसके और क्या कारण हो सकते हैं? - रमेश पारीक अभी संपादित करें
रमेश पारीक

2
या आप बस "dataType: json" पैरामीटर
पियरो अल्बर्टो

1
मैं एक ही समस्या में एक datatype का उपयोग किए बिना निर्दिष्ट किया गया है $.post। इस मामले में, jquery एक डेटाटाइप का अनुमान लगाता है, तब त्रुटियों जब यह पार्स करने में विफल रहता है । यह वास्तव में बुरा है, मुश्किल-से-पाया गया है। मैंने इसे डेटाटाइप को सेट करके निर्धारित किया है "text"
मश्मगर

31

मैंने कई, स्पेस-से-अलग dataTypes ( jQuery 1.5+ ) का उपयोग करके कुछ अच्छी किस्मत पाई है । जैसे की:

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

1
JQuery के दस्तावेज़ीकरण के आधार पर, इसी तरह, "jsonp xml" जैसे एक शॉर्टहैंड स्ट्रिंग पहले jsonp से xml में परिवर्तित करने का प्रयास करेगी, और, असफल होने पर, jsonp से पाठ में परिवर्तित करें, और फिर पाठ से xml में। तो यह पाठ को पहले json करने के लिए गुप्त करने की कोशिश करेगा, और यदि विफल हो गया, तो बस पाठ के रूप में माना जाता है?
एआईबीएमआर

29

आपको बस अपने AJAX कॉल में डेटा टाइप: "json" को निकालना होगा

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

22

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

मेरे मामले में मेरे jQuery Ajax अनुरोध को क्रोम में समान-मूल नीति के कारण सफल होने से रोका गया था । जब मैंने अपना सर्वर (Node.js) संशोधित किया तो सभी हल हो गए:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

यह सचमुच मुझे दीवार के खिलाफ अपना सिर पीटने के एक घंटे की लागत आई। मुझे बेवकूफ लग रहा है ...


1
धन्यवाद पीटर, मेरे पास एक ही मुद्दा था, और ब्राउज़र कंसोल पर चेतावनी संदेश मेरे लिए उलझन में है,। जहां तक ​​मुझे पता है कि कॉर्स सेंड रिक्वेस्ट (विकल्प विधि वार्ता का उपयोग करके) को ब्लॉक करता है, तो यह समझ में नहीं आता है कि ऑपरेशन पूरा होने के बाद ब्लॉक हो गया है। शायद एक कस्टम ब्राउज़र व्यवहार है..मैं फ़ायरफ़ॉक्स के साथ परीक्षण किया गया। धन्यवाद, आपके समाधान ने मेरी समस्या हल कर दी।
डेनिपेनपेरेस

15

मुझे लगता है कि आपका aspx पृष्ठ JSON ऑब्जेक्ट नहीं लौटाता है। आपके पेज को कुछ ऐसा करना चाहिए (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

इसके अलावा, अपने AjaxFailed को बदलने की कोशिश करें:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus आपको आपको मिलने वाली त्रुटि का प्रकार देना चाहिए।


12

मैंने एक अद्यतन jQuery लाइब्रेरी के साथ इस मुद्दे का सामना किया है। यदि सेवा पद्धति कुछ भी नहीं लौटा रही है तो इसका मतलब है कि वापसी प्रकार है void

फिर अपने अजाक्स कॉल में उल्लेख करें dataType='text'

यह समस्या का समाधान करेगा।


8

dataType: 'json'यदि आपके द्वारा लागू की गई वेब सेवा विधि शून्य है तो आपको अपने हेडर से निकालना होगा ।

इस स्थिति में, Ajax कॉल में JSON रिटर्न डेटाटाइप होने की उम्मीद नहीं है।


4

प्रतिक्रिया सुनिश्चित करने के लिए निम्न कोड का उपयोग करें JSON प्रारूप (PHP संस्करण) में ...

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;

4

मेरी भी यही समस्या थी। मेरी समस्या यह थी कि मेरा नियंत्रक JSON के बजाय एक स्थिति कोड लौटा रहा था। सुनिश्चित करें कि आपका नियंत्रक कुछ इस तरह लौटे:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}

3

मुझे भी ऐसी ही समस्या है, लेकिन जब मैंने डेटाटाइप को हटाने की कोशिश की: 'json' मुझे अभी भी समस्या है। मेरी त्रुटि सफलता के बजाय निष्पादित हो रही है

function cmd(){
    var data = JSON.stringify(display1());
    $.ajax({
        type: 'POST',
        url: '/cmd',
        contentType:'application/json; charset=utf-8',
        //dataType:"json",
        data: data,
        success: function(res){
                  console.log('Success in running run_id ajax')
                  //$.ajax({
                   //   type: "GET",
                   //   url: "/runid",
                   //   contentType:"application/json; charset=utf-8",
                   //   dataType:"json",
                   //   data: data,
                   //  success:function display_runid(){}
                  // });
        },
        error: function(req, err){ console.log('my message: ' + err); }
    });
}

मैं वही देख रहा हूं। 200 कोड के साथ खाली प्रतिक्रिया अभी भी त्रुटि हैंडलर को ट्रिगर कर रही है।
डबलजॉश

2

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


2

इसे देखें । इसकी भी ऐसी ही समस्या है। काम मैं कोशिश की।

हटाओ मत dataType: 'JSON',

नोट: यदि आप केवल php इको अपने अजाक्स कोड रिटर्न 200 का उपयोग करते हैं, तो PHP फाइल में केवल JSON फॉर्मेट प्रतिध्वनित करें


1

मुझे भी यही समस्या थी। ऐसा इसलिए था क्योंकि मेरी JSON प्रतिक्रिया में कुछ विशेष वर्ण हैं और सर्वर फ़ाइल UTF-8 के साथ एन्कोडेड नहीं थी, इसलिए अजाक्स कॉल ने माना कि यह एक वैध JSON प्रतिक्रिया नहीं थी।


1

यदि आप हमेशा सर्वर से JSON लौटाते हैं (कोई खाली प्रतिक्रिया नहीं), dataType: 'json'काम करना चाहिए और contentTypeइसकी आवश्यकता नहीं है। हालांकि सुनिश्चित करें कि JSON आउटपुट ...

jQuery AJAX वैध लेकिन गैर-अधिकृत JSON पर एक 'पार्सेरोर' फेंक देगा!


-1

आपकी स्क्रिप्ट JSON डेटा प्रकार में वापसी की मांग करती है।

इसे इस्तेमाल करे:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}

-9

निम्नलिखित का प्रयास करें

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: { "Operation" : "DeleteRow", 
            "TwitterId" : 1 },
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

या

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

JSON ऑब्जेक्ट में एकल उद्धरणों के बजाय दोहरे उद्धरण चिह्नों का उपयोग करें। मुझे लगता है कि इससे समस्या सुलझ जाएगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.