it-swarm.com.de

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

Ich versuche, den Accept HTTP-Header mit diesem Jquery-Code 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());
    }              
});

Im Firefox funktioniert es super.

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

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 betrat. Der Accept-Header in IE scheint zu sein: Accept: */*, text/xml.

73

Ich hatte auch Probleme damit, nicht nur in IE, sondern auch in Chrome und Safari mit jQuery 1.6.2. Diese Lösung funktioniert scheinbar in allen Browsern, die ich ausprobiert habe (Chrome, Safari, IE, Firefox).

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

Versuchen Sie das, wenn Ihnen das immer noch Probleme bereitet.

70
Joel Westberg

Mit jQuery 1.5+ können Sie die akzeptierten Header pro dataType festlegen, sodass Sie Folgendes tun können:

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

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

Laurens Grauw spricht auch über die Auswirkungen des ersten Versuchs, den Accept-Header mit Null zu löschen 

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 immer zurückgeben, um immer XML zurückzugeben, Unterstützung für einen benutzerdefinierten Medientyp wie "application/i-really-want-xml" oder Unterstützung für eine benutzerdefinierter HTTP-Header wie "X-Accept".

8
Jim Ferrans

Ich denke, das ursprüngliche Poster könnte auf diesen Link verweisen: http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx jedoch Dies erklärt nicht das Verhalten, das Sie sehen. 

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

Möglicherweise gibt es ein Problem in Ihrer jQuery-Version, oder haben Sie ein Plugin, das Ihren Datenverkehr manipuliert?

2
EricLaw

Obwohl dies nicht so ist, wie es in der Dokumentation heißt, muss es gemacht werden. 

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

Ich glaube nicht, dass IE (jede Version) Nice 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 User Agent zu prüfen, ob er IE ist. Wenn dies der Fall ist, prüfen Sie, ob Text/XML vorhanden ist. 

Viel Glück!

Bearbeiten:

Opps auf den Link. Meiner Meinung nach war IE immer das Hinzufügen von / und das Setzen des Accept-Headers fügt einfach den gewünschten Mime-Typ nach dem / hinzu.

0
BStruthers