ajax erklärt - Der Accept HTTP-Header kann nicht ordnungsgemäß mit jQuery festgelegt werden





set post (6)


Ich glaube nicht, dass IE (irgendeine Version) nett 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 sein, den User Agent zu überprüfen, ob es IE ist. Wenn dies der Fall ist, prüfen Sie, ob text / xml vorhanden ist.

Viel Glück!

Bearbeiten:

Opps auf der Verbindung. Meine Vorahnung war IE fügt immer die / und die Einstellung der Annahme Header fügt nur den gewünschten Mime-Typ nach der / .

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

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, so dass es zu: Accept: */*, text/xml . Dies führt dazu, dass mein Ajax-Aufruf die HTML-Version zurückgibt, im Gegensatz zu der xml-Version, die ich möchte.

Kann jemand den Accept-Header in IE 8 richtig setzen / löschen?

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




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 keine Accept-Header für die Anforderung standardmäßig festlegen sollten, sodass req.setRequestHeader () nur neue Accepts anhängen kann. Leider halten sich die Browser noch nicht daran. Mit der Problembeschreibung können Sie Ihren Browser testen, um zu sehen, ob er richtig funktioniert, und leider schlagen IE7, Chrome, Safari, Firefox und Opera fehl.

Laurens Grauw spricht auch über die Auswirkungen der ersten Aufhebung des Accept-Headers mit

setRequestHeader('Accept', '')

oder

setRequestHeader('Accept', null)

Diese könnten hier helfen.

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




Ich denke, dass das ursprüngliche Plakat auf diesen Link http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx haben könnte: http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx jedoch tut dies nicht erkläre das Verhalten, das du siehst.

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

Es ist möglich, dass es in Ihrer Version von jQuery ein Problem gibt, oder haben Sie vielleicht ein Plugin, das Ihren Traffic beeinträchtigt?




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 Browsern, die ich ausprobiert habe (Chrome, Safari, IE, Firefox), wie beabsichtigt 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 Ihnen das immer noch Probleme bereitet.




Mit jQuery 1.5+ können Sie die accept headers pro dataType festlegen, so dass Sie Folgendes tun können:

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



Das Format für HTTP-Header ist in der HTTP-Spezifikation definiert. Ich werde über HTTP 1.1 sprechen, für das die Spezifikation RFC 2616 ist . In Abschnitt 4.2, 'Message Headers', ist die allgemeine Struktur eines Headers definiert:

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

Diese Definition beruht auf zwei Hauptsäulen, Token und TEXT. Beide sind in Abschnitt 2.2 "Grundregeln" definiert. Token ist:

   token          = 1*<any CHAR except CTLs or separators>

Der Reihe nach ruht auf CHAR, CTL und Separatoren:

   CHAR           = <any US-ASCII character (octets 0 - 127)>

   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

   separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

TEXT ist:

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

Wo LWS linearer Leerraum ist, dessen Definition ich nicht reproduzieren kann, und OCTET ist:

   OCTET          = <any 8-bit sequence of data>

Die Definition ist mit einem Hinweis versehen:

The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].

Also, zwei Schlussfolgerungen. Erstens ist es klar, dass der Header- Name aus einer Teilmenge von ASCII-Zeichen bestehen muss - alphanumerische Zeichen, einige Interpunktionszeichen, nicht viel anderes. Zweitens gibt es in der Definition eines Header- Werts nichts, was ihn auf ASCII beschränkt oder 8-Bit-Zeichen ausschließt: Er besteht explizit aus Oktetts, wobei nur die Steuerzeichen gesperrt sind (beachten Sie, dass CR und LF als Steuerelemente gelten). Des Weiteren impliziert der Kommentar zur TEXT-Produktion, dass die Oktetts als in ISO-8859-1 befindlich zu interpretieren sind, und dass es einen Codiermechanismus gibt (der übrigens schrecklich ist), um Zeichen außerhalb dieser Codierung darzustellen.

Um insbesondere auf @BalusC zu reagieren, ist es ziemlich klar, dass Header-Werte laut Spezifikation in ISO-8859-1 sind. Ich habe High-8859-1-Zeichen (speziell einige Akzentvokale, wie sie in Französisch verwendet werden) in einem Header von Tomcat gesendet und sie von Firefox korrekt interpretiert, so dass dies in gewissem Maße sowohl in der Praxis als auch in der Theorie funktioniert (Obwohl dies ein Location-Header war, der eine URL enthält und diese Zeichen in URLs nicht zulässig sind, war dies tatsächlich illegal, aber unter einer anderen Regel!).

Das heißt, ich würde mich nicht darauf verlassen, dass ISO-8859-1 auf allen Servern, Proxies und Clients funktioniert, also würde ich mich bei der defensiven Programmierung an ASCII halten.





jquery ajax internet-explorer http header