2011-08-02 64 views
9

Có cách nào để biết liệu đối tượng jqXHR được trả về có được chuyển hướng từ một yêu cầu khác không? Ví dụ, có đoạn mã sau:Cách nhận trạng thái phản hồi jQuery.ajax?

jQuery.ajax({ 
      type:  'POST', 
      url:  'http://example.com/page.html', 
      complete: function(response, status) { 
         console.log(response.statusCode); 
         // do something 
         } 
     }); 

Nếu url ajax được chuyển hướng với mã trạng thái 301 hoặc 302, phản ứng sẽ là kết quả của các trang chuyển hướng và sẽ trả về một (OK) mã trạng thái 200. Tôi nghĩ rằng đây là lỗi của jQuery (không thực sự biết nếu đây là hành vi dự định, vì câu trả lời cuối cùng thực sự thành công) Tôi không thể nhận phản hồi gốc Tiêu đề để kiểm tra xem có tồn tại Tiêu đề vị trí hay không, vì điều này chỉ khả dụng trên các yêu cầu được chuyển hướng.

Firebug với đoạn code trên ghi hai yêu cầu này thông qua XHR

http://example.com/page.html 302 (di chuyển tạm thời) http://example.com/redirect.html 200 (OK)

Nhưng jQuery chỉ trả lại dữ liệu từ yêu cầu thứ hai.

Có thể có cách lấy dữ liệu từ yêu cầu đầu tiên? Hoặc để có được url đáp ứng và so sánh nó với một từ yêu cầu ban đầu?

Trả lời

0

Một công cụ tôi tìm thấy có thể có khả năng có thể trợ giúp là wireshark. Nó hoàn toàn miễn phí và có thể tìm ra những gì đang xảy ra với đối tượng jqXHR. Nó khá dễ sử dụng nhưng hãy làm theo các hướng dẫn sau:

http://www.wireshark.org/ Wireshark là bộ phân tích giao thức mạng cho Unix và Windows. Tôi đã chỉ chải bề mặt với công cụ này cho đến nay nhưng nó có ích khi thực hiện phân tích về các yêu cầu giữa máy của bạn và những người khác trên mạng.

Trước khi bạn bắt đầu - Wireshark ghi lại mọi yêu cầu để chỉ bắt đầu nhấp khi bạn đã sẵn sàng chụp và nhấp vào dừng khi bạn hoàn tất. - Bạn sẽ cần địa chỉ IP của bạn

đọc về nhiều analysing HTTP requests

2

Vấn đề là 301 hoặc 302 được xử lý trực tiếp bởi trình duyệt do tuân thủ các tiêu chuẩn. Mã trạng thái này không được chuyển sang cuộc gọi ajax của bạn. Cách duy nhất mà bạn biết rằng cuộc gọi đã hoàn thành là trong trình xử lý hoàn chỉnh và hơn nữa không có trạng thái hữu ích nào được đưa ra trong đối tượng jqxhr được truyền để hoàn thành. Trình xử lý thành công và lỗi sẽ không bao giờ được gọi.

Chúng tôi đã có một số mã cắm trại ruby ​​cũ sử dụng chuyển hướng đến phương thức get() khi phương thức post() được gọi để chúng tôi có thể hiển thị chế độ xem được cập nhật qua ruby ​​của tài nguyên. Khi chúng tôi chuyển sang chế độ xem JavaScript từ chế độ xem cắm trại, 301/302 không được chuyển cho đối tượng jqxhr. Chúng tôi đã phải viết lại các phương thức bài viết để trả về 200 để khắc phục vấn đề.

Dưới đây là một số bài đăng trên stackoverflow về chủ đề này.

How to manage a redirect request after a jQuery Ajax call

Catching 302 FOUND in JavaScript

HTTP redirect: 301 (permanent) vs. 302 (temporary)

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