Der Accept HTTP-Header kann mit jQuery nicht richtig festgelegt werden

75

Ich versuche, den Accept HTTP-Header mit diesem Abfragecode auf "text / xml" zu setzen:

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

In Firefox funktioniert es großartig.

Aber im IE scheint der Wert, den ich für den Accept-Header festlegen möchte, an das Ende angehängt zu werden, sodass er wie folgt lautet : Accept: */*, text/xml. Dies führt dazu, dass mein Ajax-Aufruf die HTML-Version im Gegensatz zur gewünschten XML-Version zurückgibt.

Weiß jemand, wie man den Accept-Header in IE 8 richtig setzt / löscht?

Aktualisiert: Aus irgendeinem Grund wurden die Sternchen nicht angezeigt, als ich sie eingegeben habe. Der Accept Header im IE scheint zu sein : Accept: */*, text/xml.

Zwerg
quelle

Antworten:

70

Ich hatte auch Probleme damit, nicht nur im IE, sondern auch in Chrome und Safari mit jQuery 1.6.2. Diese Lösung scheint in allen von mir getesteten Browsern (Chrome, Safari, IE, Firefox) wie vorgesehen zu funktionieren.

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

Versuchen Sie das, wenn dies immer noch Probleme bereitet.

Joel Westberg
quelle
24

Mit jQuery 1.5+ können Sie die Accept-Header festlegen, damit Sie Folgendes dataTypetun können:

$.ajax({
    dataType: ($.browser.msie) ? "text" : "xml",
    accepts: {
        xml: "text/xml",
        text: "text/xml"
    }
});
Zwerg
quelle
Aus der Quelle von 1.11.1- 'akzeptiert: {"*": allTypes, Text: "text / plain", HTML: "Text / HTML", XML: "Anwendung / XML, Text / XML", JSON: "Anwendung / json, text / javascript "}, '
nicodemus13
Dies sind also die erwarteten Akzeptanzen, und wie oben müssen Sie auch den Datentyp festlegen.
nicodemus13
9

Ihr Problem scheint das hier beschriebene zu sein: http://www.grauw.nl/blog/entry/470 . Das Problem besteht darin, dass in der XMLHttpRequest-Spezifikation derzeit festgelegt ist, dass Benutzeragenten standardmäßig keine Accept-Header für die Anforderung festlegen sollten, sodass req.setRequestHeader () nur neue Accepts anhängen kann. Leider halten sich Browser noch nicht daran. Mit der Problembeschreibung können Sie Ihren Browser testen, um festzustellen, ob er ordnungsgemäß funktioniert. Leider schlagen IE7, Chrome, Safari, Firefox und Opera fehl.

Laurens Grauw spricht auch über die Auswirkungen des ersten Versuchs, den Accept-Header mit auf Null zu setzen

setRequestHeader('Accept', '')

oder

setRequestHeader('Accept', null)

Diese könnten hier helfen.

Hässliche serverseitige Hacks: Wenn Sie die Kontrolle über Ihre serverseitige App haben, können Sie sie fest verdrahten, um immer XML zurückzugeben, Unterstützung für einen benutzerdefinierten Medientyp wie "application / i-real-want-xml" hinzuzufügen oder Unterstützung für a hinzuzufügen Benutzerdefinierter HTTP-Header wie "X-Accept".

Jim Ferrans
quelle
setRequestHeader ('Accept', null) gibt "type mismatch" in IE8 an. Das Setzen auf "" funktioniert zuerst!
Mplungjan
2

Ich denke, das Originalposter hat möglicherweise auf diesen Link verwiesen : http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx , dies ist jedoch nicht der Fall Erklären Sie das Verhalten, das Sie sehen.

IE hat an sich nicht das von Ihnen beschriebene Verhalten, und das Festlegen des Accept-Headers über XMLHTTPRequest sollte ordnungsgemäß funktionieren. Ich habe in IE8 getestet, um zu bestätigen.

Möglicherweise gibt es ein Problem in Ihrer Version von jQuery, oder haben Sie ein Plugin, das Ihren Datenverkehr beeinträchtigt?

EricLaw
quelle
1

Obwohl in der Dokumentation nicht angegeben ist, dass dies getan werden muss, hat es für mich funktioniert.

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

Ich glaube nicht, dass IE (jede Version) gut mit dem Accept-Header spielt. Siehe diesen Link: [ http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

Eine mögliche Lösung könnte darin bestehen, den Benutzeragenten zu überprüfen, um festzustellen, ob es sich um einen IE handelt. Wenn dies der Fall ist, überprüfen Sie, ob text / xml vorhanden ist.

Viel Glück!

Bearbeiten:

Opps auf dem Link. Meine Vermutung war, dass IE immer das / hinzufügt und das Setzen des Accept-Headers nur den gewünschten MIME-Typ nach dem / hinzufügt .

BStruthers
quelle
Es wird nicht nur das / hinzugefügt. Es fügt tatsächlich hinzu: * / * Formatierungsproblem in der Frage
Ja, ich dachte, es wäre ein Formatierungsproblem ... Ich sah mich dem gleichen Problem gegenüber
BStruthers