2010-09-23 6 views
10

Es sieht so aus, als hätten Leute in der Vergangenheit Probleme mit Accept-Headern gehabt, aber ich bin mir nicht sicher, ob mein Problem damit zusammenhängt. Mit jQuery 1.4.2 habe ich Probleme, JSON mit getJSON() zu bekommen. Ich kann die Anfrage/Antwort in Firebug beobachten und es sieht so aus, als ob die Quelle des Problems ist, dass die betreffende Ressource abhängig vom Accept-Header unterschiedliche Ergebnisse zurückgibt. Obwohl die Dokumente sagen, dass es eingestellt werden sollte, zeigt es sich in Firebug als "/" - offensichtlich will ich "application/json". Ist das ein bekannter Fehler? Soll ich eine Flagge setzen, von der ich nichts weiß?JQuery's getJSON() Accept Header korrekt einstellen?

ETA: Die Anfrage ist Cross-Site, wenn das wichtig ist, aber ich übergebe einen callback=? Abfrageparameter, so dass JQuery (erfolgreich!) Behandelt es als JSONP. Der Service, den ich in diesem speziellen Fall anrufe, unterstützt einen accept override Abfrageparameter (&accept=application/json), also habe ich es manuell ausgeführt, aber ich halte den Header-Screwup immer noch für merkwürdig und hoffte, dass ich es beheben könnte. Ich stoße nicht mehr darauf, wenn ich mit einem anderen Dienst zu tun habe, der vielleicht nicht so verzeihend ist. Ich habe nicht eine einfache Möglichkeit, müssen Sie den Code aus meiner Entwicklungsumgebung zu kopieren/einfügen, aber hier ist das Wesentliche:

$.getJSON(baseURL + "?item=" + itemNum + "&callback=?", function(data){ 
    console.log(data); 
} 

Wie Sie sehen können, ist dies nicht gerade komplex und sollte (I 99 bin % sure ...) führt dazu, dass ein XHR mit einem Accept-Header von application/json gesendet wird. Wie ich schon sagte, das passiert nicht, per Firebugs Net-Konsole. Wenn es darauf ankommt, ist dies in Firefox 3.6.8.

ETA Nochmal: Für jeden, der das noch liest, ja, es passiert immer noch, und nein, ich habe keine Ahnung warum. Wie ich schon sagte, einfacher Aufruf getJSON(), wirklich grundlegende Syntax, Cross-Site, wie JSONP behandelt, weil es einen Callback-Abfrageparameter enthält. Immer noch offen für Vorschläge!

+1

Zeigen Sie uns Ihren Code und wir helfen Ihnen vielleicht mehr. – Steven

+0

Ich habe genau das gleiche Problem in Chrome 8. $ .getJSON ("URL", Funktion (Daten) {}) setzt die Accept-Kopfzeile auf */* –

Antwort

13

Dies ist kein Fehler.

Da Ihr Anruf domänenübergreifend ist, lässt Ihr Browser keine XHR-Anrufe zu (Richtlinie mit demselben Ursprung). Intern arbeitet jQuery mit dem "<script> tag hack" daran, den domainübergreifenden Aufruf zu machen (dies ist die grundlegende Idee hinter dem JSONP Datentyp). Da der Aufruf über das Tag erfolgt, ist es jQuery einfach nicht möglich, den accepts Teil des Headers zu ändern.

jQuery funktioniert seine Magie, indem er diese Details vor Ihnen versteckt, aber leider scheinen Sie in diesem Fall der Law of Leaky Abstractions unterliegen.

+0

Sehr aufschlussreiche Antwort –

2

Ohne Ihren Code zu sehen (was uns auf eine offensichtliche Lösung hinweisen könnte), können Sie versuchen, die Standard-Ajax-Funktion zu verwenden und zu sehen, ob Sie andere Ergebnisse erhalten?

$.ajax({ 
    url: '/what.eva', 
    dataType: 'json', 
    data: '{}', 
    success: callbackFunc 
}); 

function callbackFunc(result) { 
    alert(result); 
} 
+0

Ich habe versucht, was Sie vorgeschlagen, meinen getJSON-Aufruf (Details jetzt in der Hauptfrage aufgelistet) mit einem $ .ajax Aufruf, und die Ergebnisse sind genau gleich. Ich denke, das muss ein bekannter Fehler sein, oder vielleicht ist es nur, dass mein Browser komisch ist, aber das widerspricht definitiv dem erwarteten Verhalten. – Coderer

2

Dies ist ein Fehler, der auf der jquery-Website geschlossen wurde.

http://dev.jquery.it/ticket/6551

Es scheint keine Lösung für dieses noch zu sein.

+0

Wow, jemand anders hat das Problem, aber sie können nicht reproduzieren, also haben sie es geschlossen? Ich werde sehen, ob ich dazu beitragen kann, irgendwie ... – Coderer

+0

Für den Fall, dass Sie neugierig sind: Das Ticket wurde gelöst, und Pete's Antwort ist die richtige - obwohl es aussieht * wie eine "normale" AJAX-Anfrage (XHR), es ist mit einem dynamischen '