Не удается правильно установить HTTP-заголовок Accept с помощью jQuery - PullRequest
73 голосов
/ 18 июля 2009

Я пытаюсь установить для заголовка Accept HTTP значение "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.

Ответы [ 6 ]

70 голосов
/ 14 июля 2011

У меня тоже были проблемы не только в 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) {
        ...
    }
})

Попробуйте, если это все еще доставляет вам неприятности.

24 голосов
/ 20 июля 2011

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

$.ajax({
    dataType: ($.browser.msie) ? "text" : "xml",
    accepts: {
        xml: "text/xml",
        text: "text/xml"
    }
});
8 голосов
/ 21 июля 2009

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

Лорен Грау также рассказывает об эффектах первой попытки обнулить заголовок Accept с помощью

setRequestHeader('Accept', '')

или

setRequestHeader('Accept', null)

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

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

2 голосов
/ 18 июля 2009

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

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

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

1 голос
/ 03 ноября 2015

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

 jQuery.ajax({
    type: "POST",
    url: "...",
    data: ...,
    contentType: "text/xml",
    beforeSend: function(req) {
    req.setRequestHeader("Accept", "text/xml");
    },  ...});
0 голосов
/ 18 июля 2009

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

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

Удачи!

Редактировать:

Opps на ссылке.Я догадывался, что IE всегда добавляет / и установка заголовка accept просто добавляет желаемый тип пантомимы после / .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...