Tiêu đề phản hồi của jQuery và AJAX


163

Vì vậy, tôi đã nhận được cuộc gọi AJAX jQuery này và phản hồi đến từ máy chủ dưới dạng chuyển hướng 302. Tôi muốn thực hiện chuyển hướng này và tải nó trong iframe, nhưng khi tôi cố gắng xem thông tin tiêu đề bằng cảnh báo javascript, nó sẽ xuất hiện không, mặc dù fireorms nhìn thấy nó chính xác.

Đây là mã, nếu nó sẽ giúp:

$j.ajax({
    type: 'POST',
    url:'url.do',
    data: formData,
    complete: function(resp){
        alert(resp.getAllResponseHeaders());
    }
});

Tôi thực sự không có quyền truy cập vào nội dung phía máy chủ để di chuyển URL đến phần phản hồi, mà tôi biết sẽ là giải pháp đơn giản nhất, vì vậy mọi trợ giúp về phân tích cú pháp của tiêu đề sẽ rất tuyệt vời.


3
nếu bạn đang truy cập câu hỏi này vào năm 2017 trở lên, xin đừng lãng phí thời gian với hầu hết các câu trả lời hiện có. Nếu vấn đề của bạn giống với OP, bạn có hai tùy chọn: 1) thiết lập máy chủ proxy sẽ postlà máy chủ gốc và trích xuất dữ liệu đích và JS mặt trước sẽ yêu cầu máy chủ proxy này cho dữ liệu đích. Hoặc, 2) thay đổi mã của máy chủ để cho phép CORS.
kmonsoor

Câu trả lời:


186

Giải pháp của cballou sẽ hoạt động nếu bạn đang sử dụng một phiên bản cũ của jquery. Trong các phiên bản mới hơn, bạn cũng có thể thử:

  $.ajax({
   type: 'POST',
   url:'url.do',
   data: formData,
   success: function(data, textStatus, request){
        alert(request.getResponseHeader('some_header'));
   },
   error: function (request, textStatus, errorThrown) {
        alert(request.getResponseHeader('some_header'));
   }
  });

Theo tài liệu , đối tượng XMLHttpRequest có sẵn kể từ jQuery 1.4.


5
Vì jQuery> = 1.5, nên được gọi là jqXHR , đây là siêu bộ của một đối tượng XHR.
Johan

136

Nếu đây là yêu cầu CORS , bạn có thể thấy tất cả các tiêu đề trong các công cụ gỡ lỗi (như Chrome-> Inspect Element-> Network), nhưng đối tượng xHR sẽ chỉ truy xuất tiêu đề (thông qua xhr.getResponseHeader('Header')) nếu tiêu đề đó là tiêu đề phản hồi đơn giản :

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control
  • Expires
  • Pragma

Nếu nó không có trong bộ này, thì nó phải có trong tiêu đề Access-Control-Expose-Headers được máy chủ trả về.

Về trường hợp được đề cập, nếu đó là một yêu cầu CORS, người ta sẽ chỉ có thể truy xuất Locationtiêu đề thông qua XMLHttpRequestđối tượng nếu và chỉ khi, tiêu đề bên dưới cũng có mặt:

Access-Control-Expose-Headers: Location

Nếu nó không phải là yêu cầu CORS, XMLHttpRequestsẽ không có vấn đề gì khi truy xuất nó.


3
@acdcjunior cảm ơn bạn cũng đã giúp tôi, sau khi tôi đã đầu tư một chút thời gian để tìm hiểu lý do tại sao không có đầu ra trong phản hồi tiêu đề
daniyel

33
 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });

1
không làm việc cho tôi. có lẽ tôi đang làm yêu cầu đến một trang web khác? (yêu cầu trang web chéo sử dụng ajax)
Siwei Shen

9
Đối với những người không thể có nó làm việc như tôi. Có thể là do bạn đang thực hiện truy cập tên miền chéo mà jquery không sử dụng XHR. api.jquery.com/jQuery.get
h - n

Woking như một bùa mê .. +1
ErShakirAnsari

18

Một sự thật đáng tiếc về AJAX và chuyển hướng 302 là bạn không thể nhận được các tiêu đề từ sự trở lại vì trình duyệt không bao giờ đưa chúng cho XHR. Khi trình duyệt thấy 302, nó sẽ tự động áp dụng chuyển hướng. Trong trường hợp này, bạn sẽ thấy tiêu đề trong fireorms vì trình duyệt đã nhận nó, nhưng bạn sẽ không thấy nó trong ajax, vì trình duyệt không vượt qua nó. Đây là lý do tại sao thành công và xử lý lỗi không bao giờ được gọi. Chỉ xử lý hoàn chỉnh được gọi.

http://www.checkupdown.com/status/E302.html

The 302 response from the Web server should always include an alternative URL to which redirection should occur. If it does, a Web browser will immediately retry the alternative URL. So you never actually see a 302 error in a Web browser

Dưới đây là một số bài viết stackoverflow về chủ đề này. Một số bài viết mô tả các bản hack để khắc phục vấn đề này.

Cách quản lý yêu cầu chuyển hướng sau cuộc gọi jQuery Ajax

Bắt 302 FOUND trong JavaScript

Chuyển hướng HTTP: 301 (vĩnh viễn) so với 302 (tạm thời)


10

Đối tượng XMLHttpRequest nằm bên dưới được jQuery sử dụng sẽ luôn âm thầm theo dõi các chuyển hướng thay vì trả về mã trạng thái 302. Do đó, bạn không thể sử dụng chức năng yêu cầu AJAX của jQuery để nhận URL được trả về. Thay vào đó, bạn cần đặt tất cả dữ liệu vào một biểu mẫu và gửi biểu mẫu với targetthuộc tính được đặt thành giá trị của namethuộc tính của iframe:

$('#myIframe').attr('name', 'myIframe');

var form = $('<form method="POST" action="url.do"></form>').attr('target', 'myIframe');
$('<input type="hidden" />').attr({name: 'search', value: 'test'}).appendTo(form);

form.appendTo(document.body);
form.submit();

url.doTrang của máy chủ sẽ được tải trong iframe, nhưng khi trạng thái 302 của nó đến, iframe sẽ được chuyển hướng đến đích cuối cùng.


9

thử cái này:

type: "GET",
async: false,
complete: function (XMLHttpRequest, textStatus) {
    var headers = XMLHttpRequest.getAllResponseHeaders();
}

Hừm. Cảm ơn rất nhiều vì đã trả lời, nhưng điều đó vẫn trả về null. Còn ý tưởng nào khác không?
Shane

có thể bạn đang sử dụng một phiên bản cũ của jquery.
rovsen

6

CẬP NHẬT 2018 CHO JQUERY 3 VÀ LATER

Tôi biết đây là một câu hỏi cũ nhưng không có giải pháp nào ở trên làm việc cho tôi. Đây là giải pháp hiệu quả:

//I only created this function as I am making many ajax calls with different urls and appending the result to different divs
function makeAjaxCall(requestType, urlTo, resultAreaId){
        var jqxhr = $.ajax({
            type: requestType,
            url: urlTo
        });
        //this section is executed when the server responds with no error 
        jqxhr.done(function(){

        });
        //this section is executed when the server responds with error
        jqxhr.fail(function(){

        })
        //this section is always executed
        jqxhr.always(function(){
            console.log("getting header " + jqxhr.getResponseHeader('testHeader'));
        });
    }

2

+1 cho PleaseStand và đây là bản hack khác của tôi:

Sau khi tìm kiếm và thấy rằng "yêu cầu chéo ajax" không thể nhận được các tiêu đề phản hồi từ đối tượng XHR, tôi đã từ bỏ. và sử dụng iframe thay thế.

1. <iframe style="display:none"></iframe>
2. $("iframe").attr("src", "http://the_url_you_want_to_access")
//this is my aim!!!
3. $("iframe").contents().find('#someID').html()  
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.