Bagaimana cara mendapatkan kode status tanggapan dari jQuery.ajax?

230

Dalam kode berikut, semua yang saya coba lakukan adalah mendapatkan kode respons HTTP dari panggilan jQuery.ajax. Kemudian, jika kodenya 301 (Dipindahkan Secara Permanen), tampilkan tajuk respons 'Lokasi':

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) {
    $.ajax({
      url: url,
      complete: function (jqxhr, txt_status) {
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) {
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // }
      }
    });
  }
  </script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('a').mouseenter(
      function () {
        get_resp_status(this.href);
      },
      function () {
      }
    );
  });
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>

Bisakah seseorang menunjukkan kesalahan saya? Ketika saya memeriksa objek 'jqxhr' di Firebug, saya tidak dapat menemukan kode status, atau header respons 'Lokasi'. Saya menetapkan breakpoint pada baris terakhir 'lengkap'.

Terimakasih banyak.

Mahesh
sumber
Saya tahu ini sudah tua, tapi saya pikir saya menyelesaikannya (XHR.responseURL): stackoverflow.com/a/39416846/4946681
Nate

Jawaban:

221

Saya melihat bidang status pada objek jqXhr, ini biola yang berfungsi:

http://jsfiddle.net/magicaj/55HQq/3/

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});
Adam Ayres
sumber
2
Tampaknya bekerja di jsFiddle. Berdasarkan hal itu dan jQuery documentstion, xhr.status harus melakukan apa yang saya inginkan. Namun, ketika saya mencoba hal yang sama dalam kode asli saya (txt_status diganti dengan jqxhr.status), saya terus mendapatkan jqxhr.status dari 0. Berikut adalah tangkapan layar: twitpic.com/4alsqj
Mahesh
10
Saya percaya masalahnya adalah Anda tidak menjalankan server web tetapi secara lokal dari sistem file. Saya pikir jika Anda menjalankan server web lokal ini akan berfungsi dengan benar, berikut adalah beberapa artikel tentang hal ini: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest "Hal utama yang perlu diperhatikan di sini adalah bahwa status hasil dibandingkan dengan 0 untuk keberhasilan alih-alih 200. Ini karena skema file dan ftp tidak menggunakan kode hasil HTTP. "
Adam Ayres
ini bagus. Terutama ketika saya dapat meminta backend saya mengirimkan kode status.
tengah
Perhatikan bahwa jika responsnya adalah status pengalihan seperti 302, ini akan memberikan 200
Akuntan «
52

Datang di utas lama ini mencari solusi yang sama sendiri dan menemukan jawaban yang diterima menggunakan .complete()metode jquery ajax. Saya mengutip pemberitahuan di situs web jquery di sini:

The jqXHR.success (), jqXHR.error (), dan jqXHR.complete () callback ditinggalkan sebagai jQuery 1.8. Untuk menyiapkan kode Anda untuk penghapusan akhirnya, gunakan jqXHR.done (), jqXHR.fail (), dan jqXHR.always () sebagai gantinya.

Untuk mengetahui status coderespons ajax, seseorang dapat menggunakan kode berikut:

$.ajax( url [, settings ] )
.always(function (jqXHR) {
    console.log(jqXHR.status);
});

Bekerja sama untuk .done()dan.fail()

wajah
sumber
2
Ini mengembalikan "tidak terdefinisi"
Pedro Joaquín
43

Mungkin jQuery lebih idiomatis untuk menggunakan properti statusCode dari objek parameter yang diteruskan ke fungsi $ .ajax:

$.ajax({
  statusCode: {
    500: function(xhr) {
      if(window.console) console.log(xhr.responseText);
    }
  }
});

Namun, seperti yang dikatakan Livingston Samuel , tidak mungkin untuk menangkap 301 kode status dalam javascript.

rstackhouse
sumber
41

Ketika permintaan XHR Anda mengembalikan respons Pengalihan (HTTP Status 301, 302, 303, 307), maka XMLHttpRequest secara otomatis mengikuti URL yang dialihkan dan mengembalikan kode status URL itu .

Anda bisa mendapatkan kode status non-redirect (200, 400, 500 dll) melalui statusproperti objek xhr.

Jadi Anda tidak bisa mendapatkan lokasi diarahkan dari header respon dari 301, 302, 303atau 307permintaan.

Anda mungkin harus mengubah logika server Anda untuk merespons dengan cara yang Anda bisa menangani redirect, daripada membiarkan browser melakukannya. Sebuah contoh implementasi .

Livingston Samuel
sumber
24

Anda dapat memeriksa konten respone Anda, cukup konsol.log itu dan Anda akan melihat properti whitch memiliki kode status. Jika Anda tidak mengerti jsons, silakan lihat video: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Ini menjelaskan pengetahuan yang sangat mendasar yang membuat Anda merasa lebih nyaman dengan javascript.

Anda dapat melakukannya dengan versi permintaan ajax yang lebih pendek, silakan lihat kode di atas:

$.get("example.url.com", function(data) {
                console.log(data);
            }).done(function() {
               // TO DO ON DONE
            }).fail(function(data, textStatus, xhr) {
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            }).always(function() {
                 //TO-DO after fail/done request.
                 console.log("ended");
            });

Contoh keluaran konsol:

error 403 
STATUS: Forbidden 
ended
Przemysław Sienkiewicz
sumber
1
Terima kasih telah menyediakan kode lengkap tentang cara menggunakan dilakukan, gagal dan selalu, dengan parameter fungsi penuh.
IvanD
4

jqxhr adalah objek json:

pengembalian lengkap: objek
jqXHR (dalam jQuery 1.4.x, XMLHTTPRequest) dan string yang mengkategorikan status permintaan ("sukses", "tidak dimodifikasi", "kesalahan", "batas waktu", "batalkan", atau "parsererror") .

lihat: jQuery ajax

jadi kamu akan melakukan:

jqxhr.status untuk mendapatkan status

Naftali alias Neal
sumber
2

NB: Menggunakan jQuery 3.4.1

$.ajax({
  url: URL,
  success: function(data, textStatus, jqXHR){
    console.log(textStatus + ": " + jqXHR.status);
    // do something with data
  },
  error: function(jqXHR, textStatus, errorThrown){
    console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
  }
});
SurfingSanta
sumber