Не вдається правильно встановити заголовок Accept HTTP за допомогою jQuery


75

Я намагаюся встановити для заголовка 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.

Відповіді:


70

У мене також були проблеми з цим, не тільки в 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

За допомогою jQuery 1.5+ ви можете встановити заголовки акцепту, dataTypeщоб зробити щось подібне:

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

З джерела 1.11.1- 'приймає: {"*": allTypes, text: "text / plain", html: "text / html", xml: "application / xml, text / xml", json: "application / json, text / javascript "}, '
nicodemus13

Отже, це очікувані акцепти, і, як вище, ви також повинні встановити тип даних.
nicodemus13

9

Здається, ваша проблема описана тут: 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-really-want-xml", або додати підтримку для користувацький заголовок HTTP, такий як "X-Accept".


setRequestHeader ('Accept', null) видає "невідповідність типу" в IE8. Перш за все працює ""!
mplungjan

2

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

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

Можливо, у вашій версії jQuery є проблема, або, можливо, у вас є якийсь плагін, який керує вашим трафіком?


1

Хоча це не так, як в документації зазначено, що це потрібно робити, це те, що мені вдалося.

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

0

Я не вірю, що IE (будь-яка версія) грає добре із заголовком Accept. Дивіться це посилання: [ http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

Можливим рішенням може бути перевірка Агента користувача на наявність IE. Якщо це так, то перевірте наявність тексту / xml.

Щасти!

Редагувати:

Опс за посиланням. На мою думку, IE завжди додає /, а встановлення заголовка accept просто додає бажаний тип mime після / .


Він не додає лише /. Це фактично додає: * / * Проблема форматування у питанні

Так, я зрозумів, що це проблема форматування ... Я зіткнувся з тим самим
BStruthers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.