Невозможно правильно настроить HTTP-заголовок Accept с помощью jQuery

Я пытаюсь установить HTTP-заголовок Accept для "text/xml" с помощью этого кода jquery:

$.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());
    }              
});

В firefox он отлично работает.

Но в IE значение, которое я пытаюсь установить для заголовка Accept, похоже, добавляется к концу, поэтому оно становится: Accept: */*, text/xml. Это приводит к тому, что мой вызов ajax возвращает html-версию, а не версию xml, которую я хочу.

Кто-нибудь знает, как правильно установить/очистить заголовок Accept в IE 8?

Обновлено: по какой-то причине звездочки не появлялись, когда я их вводил. Заголовок Accept в IE выглядит следующим образом: Accept: */*, text/xml.

Ответ 1

У меня также были проблемы с этим, а не только в IE, но также в Chrome и Safari с использованием jQuery 1.6.2. Похоже, что это решение работает во всех браузерах, которые я пробовал (Chrome, Safari, IE, Firefox).

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

Попробуйте, если это все еще вызывает проблемы.

Ответ 2

Используя jQuery 1.5+, вы можете установить заголовки accepts за dataType, чтобы вы могли сделать что-то вроде этого:

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

Ответ 3

Кажется, что ваша проблема описывается здесь: http://www.grauw.nl/blog/entry/470. Проблема заключается в том, что спецификация XMLHttpRequest в настоящее время заявляет, что пользовательские агенты не должны устанавливать заголовки Accept по умолчанию для запроса, так что req.setRequestHeader() может просто добавить новые Accept. К сожалению, браузеры пока не придерживаются этого. Проблема writeup позволяет протестировать ваш браузер, чтобы убедиться, что он работает правильно, и, к сожалению, IE7, Chrome, Safari, Firefox и Opera не работают.

Laurens Grauw также рассказывает о последствиях первой попытки отклонить заголовок Accept с помощью

setRequestHeader('Accept', '')

или

setRequestHeader('Accept', null)

Это может помочь здесь.

Ужасные серверные взломы: если у вас есть контроль над своим серверным приложением, вы можете заставить его всегда возвращать XML, добавлять поддержку для пользовательского типа мультимедиа, например "application/i-really-want-xml", или добавлять поддержка настраиваемого HTTP-заголовка, например "X-Accept".

Ответ 4

Я думаю, что исходный плакат мог ссылаться на эту ссылку: http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx однако это не объясняет поведение, которое вы видите,

IE сам по себе не описывает поведение, которое вы описываете, и установка заголовка Accept через XMLHTTPRequest должна работать должным образом. Я тестировал в IE8 для подтверждения.

Возможно ли, что в вашей версии jQuery возникла проблема, или, возможно, у вас есть плагин, управляющий вашим трафиком?

Ответ 5

Хотя это не то, как документация утверждает, что это нужно сделать, это то, что сработало для меня.

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

Ответ 6

Я не считаю, что IE (любая версия) играет хорошо с заголовком Accept. См. Эту ссылку: [http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

Возможным решением может быть проверка User Agent, чтобы узнать, является ли он IE. Если это так, проверьте наличие текста /xml.

Удачи!

Edit:

Перемещение по ссылке. Моя догадка заключалась в том, что IE всегда добавлял /, и установка заголовка accept просто добавляет желаемый тип mime после /.