2011-03-17 65 views
159

Trong đoạn mã sau, tất cả những gì tôi đang cố làm là lấy mã phản hồi HTTP từ một cuộc 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í':Cách nhận mã trạng thái phản hồi từ jQuery.ajax?

<?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 Firebug, 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 ngắt trên dòng cuối cùng của 'hoàn thành'.

Cảm ơn nhiều.

+1

https://api.jquery.com/jQuery.ajax/ – ehsan

+0

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

Trả lời

157

tôi thấy lĩnh vực tình trạng trên đối tượng jqXhr, đây là một fiddle với nó làm việc:

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

Dường như nó hoạt động trong jsFiddle. Dựa trên đó và jQuery documentstion, xhr.status nên làm những gì tôi muốn. Tuy nhiên, khi tôi cố gắng như vậy trong mã ban đầu của tôi (txt_status thay thế bằng jqxhr.status), tôi tiếp tục nhận được jqxhr.status của 0. Đây là một ảnh chụp màn hình: http://twitpic.com/4alsqj – Mahesh

+9

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

+0

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

2

jqxhr là một đối tượng json: trả về

hoàn chỉnh:
Đối tượng jqXHR (trong đối tượng 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", "notmodified", "error", "timeout", "abort" hoặc "parsererror").

see: jQuery ajax

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

jqxhr.status để có được tình trạng

36

Khi yêu cầu XHR của bạn trả về một phản ứng Redirect (HTTP Status 301, 302, 303, 307), số XMLHttpRequestautomatically follows the redirected URL and returns the status code of that URL.

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

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

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 làm điều đó. An example implementation.

30

Nó có lẽ là nhiều thành ngữ jQuery để sử dụng tài sản statusCode của đối tượng tham số 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, nó không thể bắt 301 mã trạng thái trong javascript.

35

Chuyển qua chuỗi cũ này tìm kiếm giải pháp tương tự cho bản thân mình và tìm câu trả lời được chấp nhận để sử dụng phương thức .complete() của jquery ajax. Tôi trích dẫn thông báo trên jquery website đây:

Các jqXHR.success(), jqXHR.error(), và jqXHR.hoàn thành() gọi lại là không được chấp nhận như của jQuery 1.8. Để chuẩn bị mã của bạn cho lần xóa cuối cùng, hãy sử dụng jqXHR.done(), jqXHR.fail() và jqXHR.always() để thay thế.

Để biết status code của một phản ứng ajax, người ta có thể sử dụng đoạn mã sau:

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

trình Tương tự cho .done().fail()

6

Bạn có thể kiểm tra nội dung respone bạn, chỉ cần console.log nó và bạn sẽ thấy thuộc tính whitch có một 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 kiến ​​thức 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ụ giao diện điều khiển đầu ra:

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, với các tham số đầy đủ chức năng. – IvanD

Các vấn đề liên quan