Thật không may, không có API để cung cấp cho bạn tiêu đề phản hồi HTTP cho yêu cầu trang ban đầu của bạn. Đó là câu hỏi ban đầu được đăng ở đây. Nó cũng đã được hỏi nhiều lần , bởi vì một số người muốn nhận được các tiêu đề phản hồi thực tế của yêu cầu trang gốc mà không đưa ra một yêu cầu khác.
Đối với các yêu cầu AJAX:
Nếu một yêu cầu HTTP được thực hiện qua AJAX, có thể nhận được các tiêu đề phản hồi bằng getAllResponseHeaders()
phương thức. Đây là một phần của API XMLHttpRequest. Để xem làm thế nào điều này có thể được áp dụng, hãy kiểm tra fetchSimilarHeaders()
chức năng dưới đây. Lưu ý rằng đây là một cách giải quyết vấn đề không đáng tin cậy đối với một số ứng dụng.
myXMLHttpRequest.getAllResponseHeaders();
Điều này sẽ không cung cấp cho bạn thông tin về các tiêu đề phản hồi HTTP của yêu cầu trang gốc, nhưng nó có thể được sử dụng để đưa ra những phỏng đoán có giáo dục về những tiêu đề đó là gì. Thêm vào đó được mô tả tiếp theo.
Nhận giá trị tiêu đề từ Yêu cầu trang ban đầu:
Câu hỏi này lần đầu tiên được hỏi cách đây vài năm, hỏi cụ thể về cách lấy tiêu đề phản hồi HTTP gốc cho trang hiện tại (tức là cùng một trang bên trong mà javascript đang chạy). Đây là một câu hỏi hoàn toàn khác so với việc đơn giản là nhận các tiêu đề phản hồi cho bất kỳ yêu cầu HTTP nào. Đối với yêu cầu trang ban đầu, các tiêu đề không có sẵn cho javascript. Việc các giá trị tiêu đề bạn cần có đáng tin cậy và đủ nhất quán hay không nếu bạn yêu cầu lại cùng một trang thông qua AJAX sẽ tùy thuộc vào ứng dụng cụ thể của bạn.
Sau đây là một vài gợi ý để giải quyết vấn đề đó.
1. Yêu cầu về Tài nguyên chủ yếu là tĩnh
Nếu phản hồi chủ yếu là tĩnh và các tiêu đề dự kiến sẽ không thay đổi nhiều giữa các yêu cầu, bạn có thể thực hiện yêu cầu AJAX cho cùng một trang mà bạn hiện đang truy cập và cho rằng chúng là cùng một giá trị là một phần của trang Phản hồi HTTP. Điều này có thể cho phép bạn truy cập các tiêu đề bạn cần bằng cách sử dụng API XMLHttpRequest đẹp được mô tả ở trên.
function fetchSimilarHeaders (callback) {
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
//
// The following headers may often be similar
// to those of the original page request...
//
if (callback && typeof callback === 'function') {
callback(request.getAllResponseHeaders());
}
}
};
//
// Re-request the same page (document.location)
// We hope to get the same or similar response headers to those which
// came with the current page, but we have no guarantee.
// Since we are only after the headers, a HEAD request may be sufficient.
//
request.open('HEAD', document.location, true);
request.send(null);
}
Cách tiếp cận này sẽ có vấn đề nếu bạn thực sự phải dựa vào các giá trị nhất quán giữa các yêu cầu, vì bạn không thể hoàn toàn đảm bảo rằng chúng giống nhau. Nó sẽ phụ thuộc vào ứng dụng cụ thể của bạn và liệu bạn có biết rằng giá trị bạn cần là thứ sẽ không thay đổi từ yêu cầu này sang yêu cầu tiếp theo.
2. Suy luận
Có một số thuộc tính BOM (Mô hình đối tượng trình duyệt) mà trình duyệt xác định bằng cách xem các tiêu đề. Một số thuộc tính này phản ánh trực tiếp các tiêu đề HTTP (ví dụ: navigator.userAgent
được đặt thành giá trị của trường User-Agent
tiêu đề HTTP ). Bằng cách đánh hơi xung quanh các thuộc tính có sẵn, bạn có thể tìm thấy những gì bạn cần hoặc một số manh mối để cho biết phản hồi HTTP chứa gì.
3. Stash chúng
Nếu bạn kiểm soát phía máy chủ, bạn có thể truy cập bất kỳ tiêu đề nào bạn muốn khi bạn tạo phản hồi đầy đủ. Các giá trị có thể được chuyển đến máy khách với trang, được lưu trong một số đánh dấu hoặc có thể trong cấu trúc JSON được nội tuyến. Nếu bạn muốn có mọi tiêu đề yêu cầu HTTP có sẵn cho javascript của mình, bạn có thể lặp qua chúng trên máy chủ và gửi lại chúng dưới dạng các giá trị ẩn trong đánh dấu. Có thể không lý tưởng để gửi các giá trị tiêu đề theo cách này, nhưng bạn chắc chắn có thể làm điều đó cho giá trị cụ thể mà bạn cần. Giải pháp này được cho là không hiệu quả, nhưng nó sẽ thực hiện công việc nếu bạn cần nó.