Yêu cầu Ajax trả về 200 OK, nhưng một sự kiện lỗi được kích hoạt thay vì thành công


805

Tôi đã thực hiện một yêu cầu Ajax trên trang web của mình và tôi đang gọi điểm cuối từ một trang web. Nó luôn trả về 200 OK , nhưng jQuery thực thi sự kiện lỗi.
Tôi đã thử rất nhiều thứ, nhưng tôi không thể tìm ra vấn đề. Tôi đang thêm mã của tôi dưới đây:

Mã 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);
}

Mã C # cho JqueryOpeartion.aspx

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

Tôi cần ("Record deleted")chuỗi sau khi xóa thành công. Tôi có thể xóa nội dung, nhưng tôi không nhận được tin nhắn này. Điều này đúng hay tôi đang làm gì sai? Cách chính xác để giải quyết vấn đề này là gì?


2
Bạn có thể chạy đầu ra của JqueryOperation.aspx thông qua trình xác nhận JSON và xem nó có hợp lệ JSON không
parapura rajkumar

1
Giống như jsonlint.com . Bạn cũng phải kiểm tra các thông số bạn gửi. Hiện tại bạn chưa đặt bất kỳ tên tham số nào. Nếu tham số là TwitterId, thì bạn phải truyền một đối tượng data, không phải là một chuỗi : data: {TwitterId: row}.
Felix Kling

6
Trang Jqueryoperation.aspx có trả về JSON (hợp lệ) không?
Salman A

1
có lẽ mã phía máy chủ của bạn đang ném một ngoại lệ .. những gì ru trở lại trong khối bắt của bạn như là phản hồi?
Raghav

3
@Raghav, nếu máy chủ ném ngoại lệ xử lý yêu cầu, thì mã trả về HTTP sẽ là 500.
StuperUser

Câu trả lời:


1118

jQuery.ajaxcố gắng chuyển đổi phần thân phản hồi tùy thuộc vào dataTypetham số đã chỉ định hoặc Content-Typetiêu đề được gửi bởi máy chủ. Nếu chuyển đổi không thành công (ví dụ: nếu JSON / XML không hợp lệ), cuộc gọi lại lỗi sẽ bị hủy.


Mã AJAX của bạn chứa:

dataType: "json"

Trong trường hợp này jQuery:

Đánh giá phản hồi dưới dạng JSON và trả về một đối tượng JavaScript. [Vắc] Dữ liệu JSON được phân tích cú pháp một cách nghiêm ngặt; bất kỳ JSON không đúng định dạng nào đều bị từ chối và lỗi phân tích cú pháp được đưa ra. [V]] một phản hồi trống cũng bị từ chối; thay vào đó, máy chủ sẽ trả về phản hồi null hoặc {}.

Mã phía máy chủ của bạn trả về đoạn mã HTML có 200 OKtrạng thái. jQuery đã mong đợi JSON hợp lệ và do đó thực hiện lệnh gọi lại lỗi parseerror.

Giải pháp là xóa dataTypetham số khỏi mã jQuery của bạn và trả lại mã phía máy chủ:

Content-Type: application/javascript

alert("Record Deleted");

Nhưng tôi muốn đề nghị trả về một phản hồi JSON và hiển thị thông báo bên trong cuộc gọi lại thành công:

Content-Type: application/json

{"message": "Record deleted"}

1
Cảm ơn phản hồi của bạn, bạn có thể vui lòng cho tôi biết một điều làm thế nào tôi có thể trả lại giá trị json từ mã phía sau. Tôi đang sử dụng Asp.net với C #. Điều này đã giải quyết vấn đề của tôi nhưng cũng có thể vui lòng cho tôi biết điều này.
Pankaj Mishra

1
@Pankaj: sẽ tốt hơn nếu bạn đăng nó dưới dạng câu hỏi khác. Nhưng câu trả lời ngắn gọn: hai cách để làm điều này (i) thay vì $.ajaxbạn có thể thử $.getScript. Bên trong tập lệnh C # phía máy chủ chỉ cần đặt alert('Record Deleted');(không có <script>thẻ) và đặt ContentType của tập lệnh C # của bạn thành text/javascript. $.ajaxcũng có thể hoạt động nhưng tôi không thể nhớ lại làm thế nào, có thể bạn chỉ cần thay đổi dataType: 'script',. Bạn có thể không cần xử lý thành công nữa.
Salman A

3
Câu trả lời này có thể không đầy đủ. Ngay bây giờ tôi đã xác thực JSON của mình tại jsonlint.com, nó nói rõ ràng rằng đó là một sự kiện vaild json, nhưng vẫn xảy ra sự cố "lỗi", với xhr.status 200. còn lý do nào khác có thể xảy ra? - Ramesh Pareek vừa mới chỉnh sửa
Ramesh Pareek

2
Hoặc bạn chỉ có thể xóa tham số "dataType: json"
Piero Alberto

1
Tôi đã gặp vấn đề tương tự mà không chỉ định kiểu dữ liệu khi sử dụng $.post. Trong trường hợp này, jquery đoán một kiểu dữ liệu, sau đó lỗi khi không phân tích cú pháp . Đây là một gotcha thực sự khó chịu, khó tìm. Tôi đã sửa nó bằng cách đặt kiểu dữ liệu thành "text".
Mashmagar

31

Tôi đã có một số may mắn khi sử dụng nhiều dataTypes, phân tách không gian ( jQuery 1.5+ ). Như trong:

$.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
Dựa trên tài liệu của JQuery, Tương tự, một chuỗi tốc ký, chẳng hạn như "jsonp xml" trước tiên sẽ cố gắng chuyển đổi từ jsonp sang xml và sau đó, chuyển đổi từ jsonp sang văn bản, sau đó chuyển từ văn bản sang xml. Vì vậy, nó sẽ cố gắng chuyển đổi văn bản thành json trước, và nếu thất bại, sau đó chỉ coi là văn bản?
anIBMer

29

Bạn chỉ cần xóa dataType: "json" trong cuộc gọi AJAX của bạn

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

Đây chỉ là bản ghi vì tôi đã va vào bài đăng này khi tìm kiếm một giải pháp cho vấn đề của tôi tương tự như của OP.

Trong trường hợp của tôi, yêu cầu jQuery Ajax của tôi đã bị ngăn không thành công do chính sách cùng nguồn gốc trong Chrome. Tất cả đã được giải quyết khi tôi sửa đổi máy chủ của mình (Node.js) để làm:

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

Nó thực sự khiến tôi mất một giờ đập đầu vào tường. Tôi cảm thấy ngu ngốc ...


1
Cảm ơn Peter, tôi đã có cùng một vấn đề và thông báo cảnh báo trên bảng điều khiển trình duyệt bị nhầm lẫn với tôi ,. Theo như tôi biết, CORS chặn yêu cầu gửi (sử dụng đàm phán phương thức tùy chọn), không có nghĩa là chặn sau khi hoạt động sau khi đã hoàn thành. Có lẽ là một hành vi tùy chỉnh trình duyệt..Tôi đã thử nghiệm với Firefox. Cảm ơn, giải pháp của bạn đã giải quyết vấn đề của tôi.
danipenaperez

15

Tôi cho rằng trang aspx của bạn không trả về một đối tượng JSON. Trang của bạn sẽ làm một cái gì đó như thế này (page_load)

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

Response.Write(OutPut);

Ngoài ra, hãy thử thay đổi AjaxFails của bạn:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus sẽ cung cấp cho bạn loại lỗi bạn đang nhận được.


12

Tôi đã đối mặt với vấn đề này với một thư viện jQuery được cập nhật. Nếu phương thức dịch vụ không trả về bất cứ điều gì thì có nghĩa là kiểu trả về là void.

Sau đó, trong cuộc gọi Ajax của bạn xin vui lòng đề cập dataType='text'.

Nó sẽ giải quyết vấn đề.


8

Bạn chỉ cần xóa dataType: 'json'khỏi tiêu đề nếu phương thức dịch vụ Web đã triển khai của bạn bị vô hiệu.

Trong trường hợp này, lệnh gọi Ajax không mong muốn có kiểu dữ liệu trả về JSON.


4

Sử dụng mã sau đây để đảm bảo phản hồi ở định dạng JSON (phiên bản PHP) ...

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

4

Tôi gặp vấn đề tương tự. Vấn đề của tôi là bộ điều khiển của tôi đã trả về mã trạng thái thay vì JSON. Đảm bảo rằng bộ điều khiển của bạn trả về một cái gì đó như:

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

3

Tôi có vấn đề tương tự nhưng khi tôi cố gắng loại bỏ kiểu dữ liệu: 'json' tôi vẫn gặp vấn đề. Lỗi của tôi là thực thi thay vì thành công

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); }
    });
}

Tôi đang thấy điều tương tự. Phản hồi trống với mã 200 vẫn đang kích hoạt trình xử lý lỗi.
doublejosh

2

Một điều khác làm tôi rối tung mọi thứ là sử dụng localhostthay vì 127.0.0.1 hoặc ngược lại. Rõ ràng, JavaScript không thể xử lý các yêu cầu từ cái này sang cái khác.


2

Xem này . Vấn đề của nó cũng tương tự. Làm việc tôi đã cố gắng.

Đừng xóa dataType: 'JSON',

Lưu ý: echo chỉ JSON Formate trong tệp PHP nếu bạn chỉ sử dụng php echo mã ajax của bạn trả về 200


1

Tôi đã từng gặp vấn đề tương tự. Đó là do phản hồi JSON của tôi chứa một số ký tự đặc biệt và tệp máy chủ không được mã hóa bằng UTF-8, vì vậy lệnh gọi Ajax cho rằng đây không phải là phản hồi JSON hợp lệ.


1

Nếu bạn luôn trả về JSON từ máy chủ (không có phản hồi trống), dataType: 'json'sẽ hoạt động và contentTypekhông cần thiết. Tuy nhiên, hãy đảm bảo đầu ra JSON ...

jQuery AJAX sẽ đưa ra một 'parseerror' trên JSON hợp lệ nhưng chưa được xác thực!


-1

Kịch bản của bạn yêu cầu trả về kiểu dữ liệu JSON.

Thử cái này:

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

-9

Hãy thử làm theo

$.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
});

HOẶC LÀ

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

Sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn trong đối tượng JSON. Tôi nghĩ rằng điều này sẽ giải quyết vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.