คำขอ Ajax ส่งคืน 200 OK แต่เหตุการณ์ข้อผิดพลาดเกิดขึ้นแทนที่จะสำเร็จ


805

ฉันใช้งานคำขอ Ajax บนเว็บไซต์ของฉันแล้วและฉันกำลังโทรหาจุดปลายทางจากเว็บเพจ มันจะคืนค่า200 OKเสมอแต่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
คุณสามารถเรียกใช้เอาต์พุตของ JqueryOperation.aspx ผ่านตัวตรวจสอบ JSON และดูว่าเป็น JSON ที่ถูกต้องหรือไม่
parapura rajkumar

1
เช่นเดียวกับjsonlint.com คุณต้องตรวจสอบพารามิเตอร์ที่คุณส่งด้วย ขณะนี้คุณยังไม่ได้ตั้งชื่อพารามิเตอร์ใด ๆ ถ้าพารามิเตอร์เป็นTwitterIdแล้วคุณจะต้องผ่านวัตถุที่จะไม่สตริง:data data: {TwitterId: row}
เฟลิกซ์

6
Jqueryoperation.aspx เพจส่งคืน (ถูกต้อง) JSON หรือไม่
Salman

1
อาจเป็นรหัสฝั่งเซิร์ฟเวอร์ของคุณกำลังโยนข้อยกเว้น .. ru อะไรกลับมาใน catch catch ของคุณเป็นการตอบกลับ
Raghav

3
@Raghav หากเซิร์ฟเวอร์มีข้อผิดพลาดในการประมวลผลคำขอดังนั้นโค้ดส่งคืน HTTP จะเป็น 500
StuperUser

คำตอบ:


1118

jQuery.ajaxพยายามแปลงเนื้อความการตอบสนองขึ้นอยู่กับdataTypeพารามิเตอร์ที่ระบุหรือContent-Typeส่วนหัวที่ส่งโดยเซิร์ฟเวอร์ หากการแปลงล้มเหลว (เช่นหาก JSON / XML ไม่ถูกต้อง) การเรียกกลับข้อผิดพลาดจะเริ่มทำงาน


รหัส AJAX ของคุณประกอบด้วย:

dataType: "json"

ในกรณีนี้ jQuery:

ประเมินการตอบสนองเป็น JSON และส่งคืนวัตถุ JavaScript […] ข้อมูล JSON มีการแยกวิเคราะห์อย่างเข้มงวด JSON ที่มีรูปแบบไม่ถูกต้องจะถูกปฏิเสธและข้อผิดพลาดในการแยกวิเคราะห์ถูกส่งออกไป […] คำตอบที่ว่างเปล่าก็ถูกปฏิเสธเช่นกัน เซิร์ฟเวอร์ควรส่งคืนการตอบกลับเป็นโมฆะหรือ {} แทน

รหัสฝั่งเซิร์ฟเวอร์ของคุณจะส่งคืนข้อมูลโค้ด HTML พร้อม200 OKสถานะ jQuery ถูกคาดหวัง JSON parseerrorที่ถูกต้องและดังนั้นจึงยิงโทรกลับข้อผิดพลาดบ่นเกี่ยวกับ

ทางออกคือการลบdataTypeพารามิเตอร์จากรหัส jQuery ของคุณและทำให้โค้ดฝั่งเซิร์ฟเวอร์คืน:

Content-Type: application/javascript

alert("Record Deleted");

แต่ฉันอยากจะแนะนำให้คืนการตอบสนอง JSON และแสดงข้อความในการติดต่อกลับที่ประสบความสำเร็จ:

Content-Type: application/json

{"message": "Record deleted"}

1
ขอบคุณสำหรับการตอบกลับของคุณคุณช่วยบอกฉันหน่อยได้ไหมว่าฉันจะคืนค่า json จากโค้ดด้านหลังได้อย่างไร ฉันใช้ Asp.net กับ C # วิธีนี้แก้ไขปัญหาของฉันได้ แต่โปรดแจ้งให้ฉันทราบด้วย
Pankaj Mishra

1
@Pankaj: จะดีกว่าถ้าคุณโพสต์เป็นคำถามอื่น แต่คำตอบสั้น: สองวิธีการทำเช่นนี้ (i) แทนคุณสามารถลอง$.ajax $.getScriptภายในฝั่งเซิร์ฟเวอร์ C # สคริปต์เพียงแค่ใส่alert('Record Deleted');(ไม่มี<script>แท็ก) และการตั้งค่า ContentType สคริปต์ C # text/javascriptของคุณไป $.ajaxอาจจะยังทำงาน dataType: 'script',แต่ฉันไม่สามารถจำได้ว่าอาจจะมีคุณเพียงแค่ต้องมีการเปลี่ยนแปลง คุณอาจไม่ต้องการตัวจัดการความสำเร็จอีกต่อไป
Salman A

3
คำตอบนี้อาจไม่สมบูรณ์ ตอนนี้ฉันตรวจสอบ JSON ของฉันที่ jsonlint.com มันบอกอย่างชัดเจนว่าเป็น vaild json แต่เหตุการณ์ "ข้อผิดพลาด" ยังคงถูกเปิดใช้งานพร้อมกับ xhr.status 200 เหตุผลอื่น ๆ ที่สามารถอยู่ที่นั่นได้บ้าง - Ramesh Pareek เพิ่งจะแก้ไข
Ramesh Pareek

2
หรือคุณสามารถลบพารามิเตอร์ "dataType: json"
Piero Alberto

1
$.postผมเคยทำงานเป็นปัญหาเดียวกันนี้โดยไม่ต้องระบุประเภทข้อมูลเมื่อใช้ ในกรณีนี้jQuery เดาประเภทข้อมูลที่ผิดพลาดแล้วเมื่อมันล้มเหลวที่จะแยก นี่เป็น gotcha ที่น่ารังเกียจและหายาก "text"ฉันคงได้โดยการตั้งค่าประเภทข้อมูลเพื่อ
Mashmagar

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 ก่อนและหากล้มเหลวให้ถือว่าเป็นข้อความหรือไม่
anIBMer

29

คุณเพียงแค่ลบdataType: "json"ในการโทร AJAX ของคุณ

$.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

นี่เป็นเพียงการบันทึกเพราะฉันชนเข้ากับโพสต์นี้เมื่อมองหาวิธีการแก้ปัญหาของฉันซึ่งคล้ายกับ OP ของ

ในกรณีของฉันคำขอ jQuery Ajax ของฉันถูกป้องกันไม่ให้สำเร็จเนื่องจากนโยบายต้นทางเดียวกันใน Chrome ทั้งหมดได้รับการแก้ไขเมื่อฉันแก้ไขเซิร์ฟเวอร์ของฉัน (Node.js) เป็น:

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

แท้จริงฉันต้องใช้เวลาหนึ่งชั่วโมงในการต่อสู้กับกำแพง ฉันรู้สึกงี่เง่า ...


1
ขอบคุณ Peter ฉันมีปัญหาเดียวกันและข้อความเตือนบนเบราว์เซอร์คอนโซลสับสนสำหรับฉัน เท่าที่ฉันรู้ CORS บล็อกคำขอส่ง (ใช้วิธีการเจรจาต่อรองตัวเลือก) ไม่มีเหตุผลที่บล็อกหลังจากการดำเนินการหลังจากเสร็จสิ้น อาจเป็นพฤติกรรมเบราว์เซอร์ที่กำหนดเอง .. ฉันทดสอบกับ Firefox ขอบคุณแนวทางแก้ไขปัญหาของฉัน
danipenaperez

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 ยังคงทำให้ตัวจัดการข้อผิดพลาดเกิดขึ้น
doublejosh

2

อีกสิ่งหนึ่งที่ทำให้สิ่งต่าง ๆ สับสนสำหรับฉันก็คือใช้localhostแทน 127.0.0.1 หรือกลับกัน เห็นได้ชัดว่า JavaScript ไม่สามารถจัดการคำขอจากที่หนึ่งไปยังอีก


2

ดูนี่สิ มันก็เป็นปัญหาที่คล้ายกัน ทำงานฉันพยายาม

อย่าลบ dataType: 'JSON',

หมายเหตุ: echo เฉพาะ JSON Formate ในไฟล์ PHP ถ้าคุณใช้ php echo เพียงแค่โค้ด ajax ของคุณคืน 200


1

ผมมีปัญหาเดียวกัน. อาจเป็นเพราะการตอบสนอง JSON ของฉันมีอักขระพิเศษบางอย่างและไฟล์เซิร์ฟเวอร์ไม่ได้เข้ารหัสด้วย UTF-8 ดังนั้นการเรียก Ajax จึงถือว่าเป็นการตอบกลับ JSON ที่ไม่ถูกต้อง


1

หากคุณส่งคืน JSON จากเซิร์ฟเวอร์เสมอ (ไม่มีการตอบกลับที่ว่างเปล่า) dataType: 'json'ควรใช้งานได้และcontentTypeไม่จำเป็น อย่างไรก็ตามตรวจสอบผลลัพธ์ JSON ...

  • ถูกต้อง ( JSONLint )
  • ถูกทำให้เป็นอนุกรม ( JSONMinify )

jQuery AJAX จะโยน 'parseerror' ลงใน 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 ฉันคิดว่านี่จะแก้ปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.