Không thể đặt đúng tiêu đề Chấp nhận HTTP với jQuery


75

Tôi đang cố đặt tiêu đề Accept HTTP thành "text / xml" với mã jquery này:

$.ajax({
    beforeSend: function(req) {
        req.setRequestHeader("Accept", "text/xml");
    },
    type: "GET",
    url: "[proper url]",
    contentType: "text/plain; charset=utf-8",
    dataType: ($.browser.msie) ? "text" : "xml",
    username: '---',
    password: '-------',                                
    success: function(data) {
        var xml;
        if (typeof data == "string") {
            alert("Data is string:" + data);
            xml = new ActiveXObject("Microsoft.XMLDOM");
            xml.async = false;
            xml.loadXML(data);
        } else {
            xml = data;
            alert("Data is not string:" + $(xml).text());
        }
        // Returned data available in object "xml"
        //alert("Status is: " + xml.statusText);
        $("#ingest_history").html($(xml).text());
    }              
});

Trong firefox nó hoạt động tuyệt vời.

Nhưng trong IE, giá trị mà tôi đang cố gắng để thiết lập cho các Chấp nhận tiêu đề dường như được gắn vào cuối cùng để nó trở thành: Accept: */*, text/xml. Điều này khiến cuộc gọi ajax của tôi trả về phiên bản html thay vì phiên bản xml mà tôi muốn.

Có ai biết cách đặt / xóa đúng tiêu đề Chấp nhận trong IE 8 không?

Đã cập nhật: Vì lý do nào đó, các dấu hoa thị không xuất hiện khi tôi nhập chúng. Chấp nhận Header trong IE dường như là: Accept: */*, text/xml.

Câu trả lời:


70

Tôi cũng gặp sự cố với điều này, không chỉ trong IE mà còn trong Chrome và Safari bằng cách sử dụng jQuery 1.6.2. Giải pháp này dường như hoạt động như dự kiến ​​trên tất cả các trình duyệt tôi đã thử (Chrome, Safari, IE, Firefox).

$.ajax({
    headers: { 
        Accept : "text/plain; charset=utf-8",
        "Content-Type": "text/plain; charset=utf-8"
    },
    data: "data",
    success : function(response) {
        ...
    }
})

Hãy thử điều đó nếu điều này vẫn khiến bạn gặp rắc rối.


24

Sử dụng jQuery 1.5+, bạn có thể đặt các tiêu đề chấp nhận cho mỗi dataTypeđể bạn có thể làm như sau:

$.ajax({
    dataType: ($.browser.msie) ? "text" : "xml",
    accepts: {
        xml: "text/xml",
        text: "text/xml"
    }
});

Từ nguồn của 1.11.1- 'chấp nhận: {"*": allTypes, text: "text / trơn", html: "text / html", xml: "application / xml, text / xml", json: "application / json, text / javascript "}, '
nicodemus13

Vì vậy, đây là những chấp nhận được mong đợi và như trên, bạn cũng phải đặt dataType.
nicodemus13

9

Vấn đề của bạn dường như là vấn đề được mô tả ở đây: http://www.grauw.nl/blog/entry/470 . Vấn đề là đặc tả XMLHttpRequest hiện nói rằng tác nhân người dùng không nên đặt bất kỳ tiêu đề Chấp nhận nào theo mặc định cho yêu cầu, do đó req.setRequestHeader () chỉ có thể thêm các Chấp nhận mới. Thật không may, các trình duyệt vẫn chưa tuân thủ điều này. Việc ghi lại sự cố cho phép bạn kiểm tra trình duyệt của mình để xem nó có hoạt động bình thường hay không và rất tiếc là IE7, Chrome, Safari, Firefox và Opera đều không thành công.

Laurens Grauw cũng nói về tác dụng của việc lần đầu tiên cố gắng loại bỏ tiêu đề Chấp nhận với

setRequestHeader('Accept', '')

hoặc là

setRequestHeader('Accept', null)

Những điều này có thể giúp ích ở đây.

Tấn công phía máy chủ xấu: Nếu bạn có quyền kiểm soát ứng dụng phía máy chủ của mình, bạn có thể cố định nó để luôn trả về XML, thêm hỗ trợ cho một loại phương tiện tùy chỉnh như "application / i-really-want-xml" hoặc thêm hỗ trợ cho một tiêu đề HTTP tùy chỉnh như "X-Accept".


setRequestHeader ('Accept', null) đưa ra "loại không khớp" trong IE8 Đặt nó thành "" hoạt động đầu tiên!
mplungjan

2

Tôi nghĩ người đăng ban đầu có thể đã đề cập đến liên kết này: http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx tuy nhiên, điều này không giải thích hành vi mà bạn thấy.

Bản thân IE không có hành vi như bạn mô tả và việc đặt tiêu đề Chấp nhận qua XMLHTTPRequest sẽ hoạt động bình thường. Tôi đã thử nghiệm trong IE8 để xác nhận.

Có thể có sự cố trong phiên bản jQuery của bạn hoặc có lẽ bạn có một số plugin làm ảnh hưởng đến lưu lượng truy cập của bạn?


1

Mặc dù đây không phải là cách tài liệu nói rằng nó cần phải được thực hiện, nhưng đó là những gì đã làm việc cho tôi.

 jQuery.ajax({
    type: "POST",
    url: "...",
    data: ...,
    contentType: "text/xml",
    beforeSend: function(req) {
    req.setRequestHeader("Accept", "text/xml");
    },  ...});

0

Tôi không tin rằng IE (bất kỳ phiên bản nào) chơi tốt với tiêu đề Chấp nhận. Xem liên kết này: [ http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

Một giải pháp khả thi có thể là kiểm tra Tác nhân người dùng để xem đó có phải là IE hay không. Nếu có, hãy kiểm tra sự hiện diện của văn bản / xml.

Chúc may mắn!

Biên tập:

Phản đối trên liên kết. Linh cảm của tôi là IE luôn thêm dấu / và việc đặt tiêu đề chấp nhận chỉ thêm kiểu kịch câm mong muốn sau dấu / .


Nó không chỉ thêm dấu /. Nó thực sự thêm: * / * Vấn đề định dạng trong câu hỏi

Yeah, I figured it được một vấn đề định dạng ... Tôi phải đối mặt với điều tương tự
BStruthers
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.