Làm cách nào để có được mã trạng thái phản hồi từ jQuery.ajax?


230

Trong đoạn mã sau, tất cả những gì tôi đang cố gắng làm là lấy mã phản hồi HTTP từ một lệnh gọi jQuery.ajax. Sau đó, nếu mã là 301 (Đã di chuyển vĩnh viễn), hãy hiển thị tiêu đề phản hồi 'Vị trí':

<?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>

Ai đó có thể chỉ ra nơi tôi đang đi sai? Khi tôi kiểm tra đối tượng 'jqxhr' trong Fireorms, tôi không thể tìm thấy mã trạng thái, cũng như tiêu đề phản hồi 'Vị trí'. Tôi đặt điểm dừng trên dòng cuối cùng là 'hoàn thành'.

Cảm ơn nhiều.



Tôi biết điều này đã cũ, nhưng tôi nghĩ rằng tôi đã giải quyết nó (XHR.responseURL): stackoverflow.com/a/39416846/4946681
Nate

Câu trả lời:


221

Tôi thấy trường trạng thái trên đối tượng jqXhr, đây là một mẹo nhỏ với nó hoạt động:

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

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});

2
Nó dường như đang làm việc trong jsFiddle. Dựa trên tài liệu đó và jQuery, xhr.status sẽ làm những gì tôi muốn. Tuy nhiên, khi tôi thử tương tự trong mã gốc của mình (txt_status được thay thế bằng jqxhr.status), tôi tiếp tục nhận được jqxhr.status bằng 0. Đây là một ảnh chụp màn hình: twitpic.com/4alsqj
Mahesh

10
Tôi tin rằng vấn đề là bạn không chạy với máy chủ web mà là cục bộ từ hệ thống tệp. Tôi nghĩ rằng nếu bạn đã kích hoạt một máy chủ web cục bộ thì nó sẽ hoạt động chính xác, đây là một số bài viết về chủ đề này: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest "Điều quan trọng cần lưu ý ở đây là trạng thái kết quả đang được so sánh với 0 để thành công thay vì 200. Điều này là do các lược đồ tệp và ftp không sử dụng mã kết quả HTTP. "
Adam Ayres

điều đó thật tuyệt. Đặc biệt là khi tôi có thể có phần phụ trợ của mình gửi mã trạng thái.
thatmiddleway

Lưu ý rằng nếu phản hồi là trạng thái chuyển hướng như 302, điều này sẽ cung cấp cho 200
Kế toán م

52

Tôi đã tự mình tìm kiếm một giải pháp tương tự và tìm ra câu trả lời được chấp nhận để sử dụng .complete()phương pháp này jquery ajax. Tôi trích dẫn thông báo trên trang web jquery ở đây:

Các cuộc gọi lại jqXHR.success (), jqXHR.error () và jqXHR.complete () không được chấp nhận kể từ jQuery 1.8. Để chuẩn bị mã của bạn để loại bỏ cuối cùng, hãy sử dụng jqXHR.done (), jqXHR.fail () và jqXHR.always () .

Để biết status codephản hồi ajax, người ta có thể sử dụng đoạn mã sau:

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

Hoạt động tương tự cho .done().fail()


2
Điều này sẽ trở lại "không xác định"
Pedro Joaquín

43

Có lẽ nhiều jQuery thành ngữ hơn khi sử dụng thuộc tính statusCode của đối tượng tham số được truyền cho hàm $ .ajax:

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

Tuy nhiên, như Livingston Samuel nói, không thể bắt được 301 mã trạng thái trong javascript.


41

Khi yêu cầu XHR của bạn trả về phản hồi Chuyển hướng (Trạng thái HTTP 301, 302, 303, 307), XMLHttpRequest tự động theo URL được chuyển hướng và trả về mã trạng thái của URL đó .

Bạn có thể nhận được các mã trạng thái không chuyển hướng (200, 400, 500, v.v.) thông qua thuộc statustính của đối tượng xhr.

Vì vậy, bạn không thể có được vị trí chuyển hướng từ tiêu đề phản ứng của một 301, 302, 303hoặc 307theo yêu cầu.

Bạn có thể phải thay đổi logic máy chủ của mình để phản hồi theo cách bạn có thể xử lý chuyển hướng, thay vì để trình duyệt thực hiện. Một ví dụ thực hiện .


24

Bạn có thể kiểm tra nội dung respone của mình, chỉ cần console.log nó và bạn sẽ thấy thuộc tính whitch có mã trạng thái. Nếu bạn không hiểu jsons, vui lòng tham khảo video: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Nó giải thích những kiến ​​thức rất cơ bản cho phép bạn cảm thấy thoải mái hơn với javascript.

Bạn có thể làm điều đó với phiên bản ngắn hơn của yêu cầu ajax, vui lòng xem mã ở trên:

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

Ví dụ đầu ra giao diện điều khiển:

error 403 
STATUS: Forbidden 
ended

1
Cảm ơn bạn đã cung cấp mã đầy đủ về cách sử dụng được thực hiện, thất bại và luôn luôn, với các tham số chức năng đầy đủ.
IvanD

4

jqxhr là một đối tượng json:

trả về đầy đủ:
Đối tượng jqXHR (trong jQuery 1.4.x, XMLHTTPRequest) và một chuỗi phân loại trạng thái của yêu cầu ("thành công", "không sửa đổi", "lỗi", "hết thời gian", "hủy bỏ" hoặc "trình phân tích cú pháp") .

xem: jQuery ajax

vì vậy bạn sẽ làm:

jqxhr.status để có được trạng thái


2

Lưu ý: Sử dụng 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);
  }
});
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.