Permintaan Ajax mengembalikan 200 OK, tetapi acara kesalahan dipecat bukannya berhasil

805

Saya telah menerapkan permintaan Ajax di situs web saya, dan saya menelepon titik akhir dari halaman web. Selalu mengembalikan 200 OK , tetapi jQuery mengeksekusi peristiwa kesalahan.
Saya mencoba banyak hal, tetapi saya tidak dapat memecahkan masalahnya. Saya menambahkan kode saya di bawah ini:

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

Kode C # untuk JqueryOpeartion.aspx

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

Saya membutuhkan ("Record deleted")string setelah penghapusan berhasil. Saya dapat menghapus konten, tetapi saya tidak mendapatkan pesan ini. Apakah ini benar atau saya melakukan kesalahan? Apa cara yang benar untuk menyelesaikan masalah ini?

Pankaj Mishra
sumber
2
Bisakah Anda menjalankan output JqueryOperation.aspx melalui validator JSON dan lihat apakah JSON valid
parapura rajkumar
1
Seperti jsonlint.com . Anda juga harus memeriksa parameter yang Anda kirim. Saat ini Anda belum menetapkan nama parameter apa pun. Jika parameter adalah TwitterId, maka Anda harus melewati sebuah objek untuk data, bukan string: data: {TwitterId: row}.
Felix Kling
6
Apakah halaman Jqueryoperation.aspx mengembalikan JSON (valid)?
Salman A
1
mungkin kode sisi server Anda melempar pengecualian .. apa yang kembali di blok tangkapan Anda sebagai tanggapan?
Raghav
3
@Raghav, jika server melemparkan pengecualian yang memproses permintaan, maka kode pengembalian HTTP akan menjadi 500.
StuperUser

Jawaban:

1118

jQuery.ajaxmencoba mengonversi badan respons tergantung pada dataTypeparameter yang ditentukan atau Content-Typeheader yang dikirim oleh server. Jika konversi gagal (mis. Jika JSON / XML tidak valid), panggilan balik kesalahan dipecat.


Kode AJAX Anda mengandung:

dataType: "json"

Dalam hal ini jQuery:

Mengevaluasi respons sebagai JSON dan mengembalikan objek JavaScript. [...] Data JSON diurai secara ketat; JSON yang cacat apa pun ditolak dan kesalahan parse dilemparkan. [...] tanggapan kosong juga ditolak; server seharusnya mengembalikan respons nol atau {} sebagai gantinya.

Kode sisi server Anda mengembalikan potongan HTML dengan 200 OKstatus. jQuery mengharapkan JSON yang valid dan karenanya memunculkan error callback yang dikeluhkan parseerror.

Solusinya adalah menghapus dataTypeparameter dari kode jQuery Anda dan mengembalikan kode sisi server:

Content-Type: application/javascript

alert("Record Deleted");

Tetapi saya lebih suka menyarankan untuk mengembalikan respons JSON dan menampilkan pesan di dalam callback sukses:

Content-Type: application/json

{"message": "Record deleted"}
Salman A
sumber
1
Terima kasih atas tanggapan Anda, tolong beri tahu saya satu hal bagaimana saya bisa mengembalikan nilai json dari kode di belakang. Saya menggunakan Asp.net dengan C #. Ini menyelesaikan masalah saya tetapi tolong beri tahu saya tentang hal ini juga.
Pankaj Mishra
1
@Pankaj: lebih baik jika Anda mempostingnya sebagai pertanyaan lain. Tetapi jawaban singkat: dua cara untuk melakukan ini (i) alih-alih $.ajaxAnda dapat mencoba $.getScript. Di dalam sisi server script C # cukup masukkan alert('Record Deleted');(tanpa <script>tag) dan atur ContentType script C # Anda text/javascript. $.ajaxmungkin juga bekerja tetapi saya tidak ingat bagaimana, mungkin Anda hanya perlu berubah dataType: 'script',. Anda mungkin tidak membutuhkan penangan sukses lagi.
Salman A
3
Jawaban ini mungkin tidak lengkap. Baru saja saya memvalidasi JSON saya di jsonlint.com, secara eksplisit mengatakan bahwa itu adalah vaild json, tetapi masih "kesalahan" acara dipecat, dengan xhr.status 200. apa alasan lain yang bisa ada? - Ramesh Pareek baru saja mengedit
Ramesh Pareek
2
Atau Anda dapat menghapus parameter "dataType: json"
Piero Alberto
1
Saya mengalami masalah yang sama tanpa menentukan tipe data saat menggunakan $.post. Dalam kasus ini, jquery menebak tipe data, kemudian kesalahan ketika gagal mengurai . Ini adalah gotcha yang benar-benar jahat, sulit ditemukan. Saya memperbaikinya dengan mengatur tipe data ke "text".
Mashmagar
31

Saya beruntung menggunakan beberapa spasi yang terpisah dataType( jQuery 1.5+ ). Seperti dalam:

$.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
});
jaketrent
sumber
1
Berdasarkan dokumentasi JQuery, Demikian pula, string singkatan seperti "jsonp xml" pertama-tama akan mencoba untuk mengkonversi dari jsonp ke xml, dan, jika gagal, konversi dari jsonp ke teks, dan kemudian dari teks ke xml. Jadi itu akan mencoba untuk teks rahasia ke json terlebih dahulu, dan jika gagal, maka hanya diperlakukan sebagai teks?
anIBMer
29

Anda cukup menghapus dataType: "json" di panggilan AJAX Anda

$.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
});
Philippe Genois
sumber
22

Ini hanya untuk catatan karena saya menabrak posting ini ketika mencari solusi untuk masalah saya yang mirip dengan OP.

Dalam kasus saya, permintaan jQuery Ajax saya dicegah agar tidak berhasil karena kebijakan asal yang sama di Chrome. Semua teratasi ketika saya memodifikasi server saya (Node.js) untuk melakukan:

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

Aku benar-benar menghabiskan satu jam membenturkan kepalaku ke dinding. Saya merasa bodoh ...

Corvin
sumber
1
Terima kasih Peter, saya memiliki masalah yang sama, dan pesan peringatan pada konsol browser membingungkan bagi saya. Sejauh yang saya tahu CORS memblokir permintaan kirim (menggunakan negosiasi metode opsi), tidak masuk akal bahwa memblokir setelah operasi setelah selesai. Mungkin adalah perilaku browser khusus .. Saya diuji dengan Firefox. Terima kasih, solusi Anda memecahkan masalah saya.
danipenaperez
15

Saya rasa halaman aspx Anda tidak mengembalikan objek JSON. Halaman Anda harus melakukan sesuatu seperti ini (page_load)

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

Response.Write(OutPut);

Coba juga untuk mengubah AjaxFailed Anda:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus seharusnya memberi Anda jenis kesalahan yang Anda dapatkan.

LeftyX
sumber
12

Saya telah menghadapi masalah ini dengan perpustakaan jQuery yang diperbarui. Jika metode layanan tidak mengembalikan apa pun, itu berarti jenis pengembaliannya void.

Kemudian dalam panggilan Ajax Anda, harap sebutkan dataType='text'.

Itu akan menyelesaikan masalah.

Suresh Vadlakonda
sumber
8

Anda hanya perlu menghapus dataType: 'json'dari tajuk Anda jika metode layanan Web yang Anda terapkan batal.

Dalam hal ini, panggilan Ajax jangan berharap untuk memiliki tipe data kembali JSON.

Bilel omrani
sumber
4

Gunakan kode berikut untuk memastikan responsnya dalam format JSON (versi PHP) ...

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

Saya memiliki masalah yang sama. Masalah saya adalah controller saya mengembalikan kode status daripada JSON. Pastikan pengontrol Anda mengembalikan sesuatu seperti:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
Alexander Suleymanov
sumber
3

Saya memiliki masalah yang sama tetapi ketika saya mencoba menghapus datatype: 'json' saya masih memiliki masalah. Kesalahan saya adalah mengeksekusi bukannya Sukses

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); }
    });
}
Rakesh Kumar
sumber
Saya melihat hal yang sama. Respons kosong dengan kode 200 masih memicu penangan kesalahan.
doublejosh
2

Hal lain yang membuat saya kacau adalah menggunakan localhostbukan 127.0.0.1 atau sebaliknya. Tampaknya, JavaScript tidak dapat menangani permintaan dari satu ke yang lain.

Paul
sumber
2

Lihat ini . Masalahnya juga mirip. Bekerja saya mencoba.

Jangan hapus dataType: 'JSON',

Catatan: gema hanya JSON Formate dalam file PHP jika Anda hanya menggunakan php gema kode ajax Anda kembali 200

Inderjeet
sumber
1

Saya memiliki masalah yang sama. Itu karena respons JSON saya berisi beberapa karakter khusus dan file server tidak dikodekan dengan UTF-8, jadi panggilan Ajax menganggap bahwa ini bukan respons JSON yang valid.

Mehdi Izcool
sumber
1

Jika Anda selalu mengembalikan JSON dari server (tidak ada respons kosong), dataType: 'json'harus berfungsi dan contentTypetidak diperlukan. Namun pastikan output JSON ...

jQuery AJAX akan melempar 'parseerror' pada JSON yang valid tetapi tidak terverifikasi!

Fabian von Ellerts
sumber
-1

Skrip Anda menuntut pengembalian dalam tipe data JSON.

Coba ini:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
Kashif Faraz
sumber
-9

Coba ikuti

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

ATAU

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

Gunakan tanda kutip ganda sebagai ganti tanda kutip tunggal dalam objek JSON. Saya pikir ini akan menyelesaikan masalah.

Salman Riaz
sumber