Невозможно правильно настроить 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 после /.