0

Ich schreibe gerade eine Google Chrome-Erweiterung, und ich muss herausfinden, Informationen über Websites Antwortheader. Um dies zu tun, habe ich die getAllResponseHeaders Methode verwendet, aber ich muss es in ein JSON-Objekt einfügen. Leider bekomme ich immer die Fehlermeldung SyntaxError: Unexpected token D in JSON at position 0 at main.Wie mache ich ein JSON-Objekt aus getAllResponseHeaders-Methode

Hier ist der Code ich dies bisher zu tun bin mit:

xmlhttp.open("GET", url, false); 
xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     allResponseHeaders = xmlhttp.getAllResponseHeaders(); 
    } 
}; 
xmlhttp.send(); 

var responseHeaders = JSON.parse(allResponseHeaders); 
obj.headers = responseHeaders; 

Wenn ich einen Alarm setzen unmittelbar nach dem allResponseHeaders = xmlhttp.getAllResponseHeaders(); Anruf, zeigt die Warnung, dass der Anruf erfolgreich war; Die Antwortheader wurden alle abgerufen. Der erste Antwort-Header ist das Datum, das ich mit dem Unexpected token D Teil meiner Fehlermeldung zu tun habe, aber ich weiß nicht, warum es nicht richtig parsen wird. Wie behebe ich das? Danke im Voraus.

EDIT: Ich würde meine JSON-Objekt mag so etwas wie folgt aussehen:

{ 
    "headers": { 
    "Date": "June 20, 2016", 
    "Content-Type": "charset=UTF/8", 
    ... 
    } 
} 
+1

JSON.parse() wird nicht funktionieren auf eine Zeichenfolge, die nicht JSON enthält ... das ist wie zu fragen, warum parseFloat() auf der Zeichenfolge funktioniert nicht „Hallo“. – nnnnnn

+0

Gibt es trotzdem, um es in eine JSON-Zeichenfolge zu konvertieren? –

+0

Was ist Ihr gewünschtes Ausgabeformat? Bitte [bearbeiten] Sie Ihre Frage, um ein Beispiel zu zeigen. Vielleicht möchten Sie auch 'console.log (allResponseHeaders)' sofort nach dem Zuweisen des Wertes zu dieser Variablen hinzufügen, so dass Sie sehen können, in welchem ​​Format es ist (Ich denke, es sollte eine Überschrift pro Zeile sein, getrennt durch Wagenrücklauf). – nnnnnn

Antwort

3

Siehe https://msdn.microsoft.com/en-us/library/ms536428(v=vs.85).aspx. Die Rückgabekopfzeilen sind eine durch CRLF getrennte Zeichenfolge, wobei jede Zeile Schlüsselwerte enthält, die durch einen Doppelpunkt getrennt sind. Sie müssen wahrscheinlich den folgenden Code anpassen, um Whitespace zu berücksichtigen.

var arr = allResponseHeaders.split('\r\n'); 
var headers = arr.reduce(function (acc, current, i){ 
     var parts = current.split(': '); 
     acc[parts[0]] = parts[1]; 
     return acc; 
}, {}); 
0

Sie JSON.parse Logik innerhalb des Callback setzen sollte onreadystatechange, da Ajax ein asynchroner Aufruf ist und allResponseHeaders kann nicht initialisiert werden, wenn Sie verwenden es direkt nach dem Senden der http-Anfrage.