Signatur
Beschreibung
Mit overrideMimeType() legen Sie fest, wie der Browser die Antwort einer XMLHttpRequest-Anfrage auswerten soll, und zwar unabhängig vom Content-Type-Header, den der Server schickt. Hilfreich ist das vor allem dann, wenn ein Server falsche oder fehlende MIME-Typen liefert, etwa XML als text/plain oder Text in einem falsch deklarierten Zeichensatz.
Typische Anwendungsfälle sind:
- XML erzwingen: Mit
overrideMimeType("text/xml")wirdresponseXMLauch dann befüllt, wenn der Server einen anderen Typ meldet. - Zeichensatz korrigieren: Mit
"text/plain; charset=ISO-8859-1"werden Umlaute aus alten Latin-1-Dateien richtig dekodiert. - Binärdaten als Rohtext (Altlast): Mit
"text/plain; charset=x-user-defined"ließen sich Bytes früher überresponseTextauslesen. Heute nimmt man dafür besserresponseType = "arraybuffer"oder"blob".
Die Methode muss vor send() aufgerufen werden. Genauer: bevor die Antwort geladen wird, also solange readyState noch nicht LOADING (3) oder DONE (4) ist. Sie verändert nur, wie der Browser die Daten auswertet. Die tatsächlichen Antwort-Header bleiben gleich, getResponseHeader("Content-Type") liefert also weiterhin den Wert des Servers.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mimeType Pflicht | string | Der MIME-Typ, mit dem die Antwort ausgewertet werden soll, z. B. "text/xml" oder "text/plain; charset=UTF-8". Ein optionaler charset-Parameter legt die Zeichenkodierung für responseText fest. Ist der Wert ungültig, wird application/octet-stream verwendet. |
Rückgabewert
undefined).Beispiele
XML-Antwort trotz falschem Content-Type als Dokument auswerten
const xhr = new XMLHttpRequest();
xhr.open("GET", "/api/feed"); // Server liefert fälschlich text/plain
xhr.overrideMimeType("text/xml");
xhr.addEventListener("load", () => {
const doc = xhr.responseXML;
const titles = [...doc.querySelectorAll("item > title")].map((t) => t.textContent);
console.log(titles);
});
xhr.send();
Latin-1-Textdatei mit korrekten Umlauten laden
const xhr = new XMLHttpRequest();
xhr.open("GET", "/daten/alt-export.txt");
// Server sendet keinen Zeichensatz, die Datei ist ISO-8859-1-kodiert
xhr.overrideMimeType("text/plain; charset=ISO-8859-1");
xhr.onload = () => {
console.log(xhr.responseText.split("\n")[0]);
// Der Header selbst bleibt unverändert:
console.log(xhr.getResponseHeader("Content-Type"));
};
xhr.send();
Promise-Wrapper mit optionalem MIME-Override
const request = (url, mimeType) =>
new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
if (mimeType) xhr.overrideMimeType(mimeType); // vor send()!
xhr.onload = () =>
xhr.status >= 200 && xhr.status < 300
? resolve(xhr)
: reject(new Error(`HTTP ${xhr.status}`));
xhr.onerror = () => reject(new Error("Netzwerkfehler"));
xhr.send();
});
const main = async () => {
const xhr = await request("/config.xml", "application/xml");
console.log(xhr.responseXML.documentElement.nodeName);
};
main();
// Wichtig · Fallstricke
- Zeitpunkt: Wird die Methode aufgerufen, wenn
readyStatebereitsLOADINGoderDONEist, wirft sie eineInvalidStateError-DOMException. Rufen Sie sie also immer vorsend()auf. - Nur die Auswertung ändert sich: Die Methode beeinflusst
responseText,responseXMLundresponse. Den Anfrage-HeaderAcceptund die Antwort-Header ändert sie nicht. Soll der Server ein bestimmtes Format liefern, verwenden SiesetRequestHeader(\"Accept\", …). - Verhältnis zu
responseType: BeiresponseType = \"json\"wird immer als UTF-8 dekodiert, eincharsetim Override wird dann ignoriert. Mit\"document\"entscheidet der überschriebene MIME-Typ, ob HTML oder XML geparst wird. - Binärdaten: Der alte Trick mit
charset=x-user-definedfunktioniert zwar noch, ist aber überholt. Für Binärdaten eignen sichresponseType = \"arraybuffer\"bzw.\"blob\"besser. - Sicherheit: Ein Override hebelt keine CORS-Prüfungen aus. Wer HTML-Antworten, die als Text erzwungen wurden, per
innerHTMLeinfügt, riskiert XSS. - Kompatibilität: Die Methode wird von allen modernen Browsern unterstützt (nicht von IE ≤ 10). In Service Workern gibt es kein
XMLHttpRequest. Die Fetch-API hat kein direktes Gegenstück: Dort liest manresponse.arrayBuffer()und dekodiert selbst mitTextDecoderoderDOMParser.