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.

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.


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"
    }
});

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".


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?


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");
    },  ...});

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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.