2009-10-13 42 views
126

Vì vậy, tôi đã có cuộc gọi jQuery AJAX 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 một iframe, nhưng khi tôi cố gắng xem thông tin tiêu đề với một cảnh báo javascript, nó đi lên null, mặc dù firebug nhìn thấy nó một cách chính xác.Tiêu đề phản hồi jQuery và AJAX

Dưới đây là đoạn code, nếu nó sẽ giúp:

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

tôi không thực sự được tiếp cận với những thứ server-side để chuyển URL cho cơ thể phản ứng, mà tôi biết sẽ giải pháp đơn giản nhất, vì vậy bất kỳ trợ giúp nào với việc phân tích cú pháp tiêu đề sẽ thật tuyệt vời.

+1

nếu bạn đang truy cập câu hỏi này vào năm 2017 hoặc muộn hơn, vui lòng khô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 như OP, bạn có hai lựa chọn: 1) thiết lập một máy chủ proxy để 'đăng' máy chủ gốc và trích xuất dữ liệu đích và JS phía 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

Trả lời

5

thử điều này: giải pháp

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

Hmm. Cảm ơn rất nhiều vì phản hồi, nhưng điều đó vẫn trả về giá trị rỗng. Bất kỳ ý tưởng nào khác? – Shane

+0

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

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

không hoạt động đối với 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) –

+9

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

+1

jqXHR là tốt hơn http://stackoverflow.com/a/4236041/456536 – iwill

137

cballou sẽ có tác dụ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')); 
    } 
    }); 

According to docs đối tượng XMLHttpRequest có sẵn trong jQuery 1.4.

+3

Kể từ jQuery> = 1.5, nó phải được gọi là [jqXHR] (http://api.jquery.com/Types/#jqXHR), là một siêu của một đối tượng XHR. – Johan

8

Đối tượng XMLHttpRequest cơ bản được sử dụng bởi jQuery will always silently follow redirects thay vì trả lại 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 trả lại. Thay vào đó, bạn cần phải đặt tất cả các dữ liệu vào một mẫu đơn và gửi biểu mẫu với các thiết lập target attribute với giá trị của các name thuộ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(); 

trang url.do của máy chủ sẽ được nạp 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.

0

1 đến PleaseStand và đây là Hack khác của tôi:

sau khi tìm kiếm và phát hiện ra rằng "yêu cầu ajax chéo" không thể 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() 
15

Sự thật không may về AJAX và chuyển hướng 302 là bạn không thể lấy tiêu đề từ trở lại vì trình duyệt không bao giờ đưa chúng đến XHR. Khi trình duyệt thấy 302, trình duyệt 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 firebug vì trình duyệt đã nhận nó, nhưng bạn sẽ không thấy nó trong ajax, bởi vì trình duyệt không vượt qua nó. Đây là lý do tại sao sự thành công và xử lý lỗi không bao giờ được gọi. Chỉ có trình xử lý hoàn chỉnh mới đượ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ề đề tài này. Một số bài viết mô tả hacks để có được xung quanh vấn đề 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)

114

Nếu đây là một CORS request, bạn có thể thấy tất cả các tiêu đề trong công cụ gỡ lỗi (như CHROME-> Inspect phần-> Network), nhưng đối tượng XHR sẽ chỉ lấy tiêu đề (qua xhr.getResponseHeader('Header')) nếu tiêu đề như vậy là simple response header:

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

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

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

Access-Control-Expose-Headers: Location 

Nếu không phải là yêu cầu CORS, XMLHttpRequest sẽ không gặp sự cố khi truy xuất nó.

+2

@acdcjunior cảm ơn bạn đã 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

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