2013-02-23 37 views
27

Tôi nhận dữ liệu phản hồi, nhưng tôi không thể lấy dữ liệu tiêu đề HTTP tùy chỉnh của mình.Không thể nhận phản hồi tiêu đề HTTP tùy chỉnh từ Ajax getAllResponseHeaders

Vâng, đây là yêu cầu tên miền chéo. Tôi đang thực hiện một yêu cầu Ajax với Javascript. Tôi đã thử với XMLHttpRequest và jQuery $ .ajax. Tôi đã thực hiện cài đặt máy chủ của tôi, tôi có những bộ khi gửi dữ liệu:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: POST, GET 

tôi làm lấy dữ liệu trả lời mà tôi muốn. Nhưng tôi không thể nhận được phản hồi tiêu đề HTTP đầy đủ.

Với PHP, tôi đặt thông tin sau trước khi gửi phản hồi văn bản. Vì vậy, tôi giả định rằng tôi sẽ nhận được nó với getAllResponseHeaders().

header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('My-Own-Test: nodatahere'); 

Nhưng đây là những gì tôi có.

Content-Type: text/plain; charset=x-user-defined 
Cache-Control: must-revalidate, post-check=0, pre-check=0 
Expires: 0 

Mất tích My-Own-Test. Chỉ để tham khảo, đây là Javascript của tôi:

var formData = new FormData(); 
formData.append('username', 'my_username'); 
formData.append('book_id', 'test password'); 
var xhr = new XMLHttpRequest(); 
xhr.open('POST', 'https://mydomain.com/proc.php', true); 
xhr.overrideMimeType("text/plain; charset=x-user-defined"); 
xhr.onload = function(e) { 
    console.log(this.getAllResponseHeaders()); 
}; 
xhr.send(formData); 

Tôi thậm chí đã thử nó với jQuery ... cùng một kết quả.

var data_to_send = { 
    username: 'my_username', 
    password: 'test_password' 
}; 
var ajaxObj; 
ajaxObj = $.ajax({ 
    url: "https://mydomain.com/proc.php", 
    data: data_to_send, 
    type: "POST", 
    beforeSend: function (xhr) { 
     xhr.overrideMimeType("text/plain; charset=x-user-defined"); 
    } 
}) 
.done(function (data) { 
    console.log(ajaxObj.getAllResponseHeaders() ); 
}); 

Vẫn ... không may mắn.

Nhưng nếu tôi đi qua Công cụ nhà phát triển Firebug hoặc Chrome, tôi có thể thấy rằng những công cụ làm trở lại thông tin HTTP Tiêu đề đầy đủ, bao gồm Content-Length, Content-Encoding, Vary, X-Powered-By, Set-Cookie, Server, và tất nhiên My-Own-Test.

+3

Tôi đoán điều này nên có một số trợ giúp http://stackoverflow.com/a/14689355/1236044 – jbl

+1

TUYỆT VỜI !!! Đó là quá dễ dàng. Tôi có 'Access-Control-Allow-Headers' nhưng tôi đoán tôi đã thiếu' Access-Control-Expose-Headers'. Điều đó đã làm điều đó. Cảm ơn người đàn ông. Tôi đã trên SO và không thể tin rằng tôi đã bỏ lỡ điều đó. Cảm ơn một lần nữa. Đã tiết kiệm cho tôi hàng giờ, có thể là vài ngày. –

+0

vui mừng vì đã có một số trợ giúp ;-) Đừng quên chấp nhận câu trả lời của bạn – jbl

Trả lời

41

Tôi muốn cảm ơn jbl vì đã chỉ cho tôi câu hỏi đúng về SO. Tôi đã nhận ngay bây giờ ...

Vì vậy, OK ... câu trả lời. Nếu bạn muốn thiết lập thông tin Header HTTP của riêng bạn, và sau đó lấy nó bằng Ajax tên miền chéo, hoặc một cái gì đó tương tự, dưới đây là một số Tiêu đề HTTP bổ sung mà bạn nên đặt ở phía máy chủ, trước khi gửi văn bản trả lời.

header('Access-Control-Allow-Origin: *'); 
header("Access-Control-Allow-Methods: POST, GET");  
header('Custom-Header: Own-Data'); 
header('Access-Control-Expose-Headers: Custom-Header'); 

Ví dụ trên sử dụng PHP. Nhưng sử dụng ngôn ngữ của riêng bạn, những gì bạn đã bao giờ sử dụng để thiết lập chúng.

Khi tôi đặt câu hỏi này, tôi có tất cả ngoại trừ Access-Control-Expose-Headers. Sau khi đưa nó vào, Javascript Ajax của tôi có thể đọc nội dung của Tiêu đề tùy chỉnh tiêu đề HTTP.

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