Rufen Sie immer JSON.stringify für Post-Daten für jQuery Ajax auf
Lesezeit: 3 Minuten
Dirk Boer
Oder eine andere Funktion, um Ihre Daten für diese Angelegenheit vorzuverarbeiten 🙂
Aufgrund meines serverseitigen Frameworks muss ich immer JSON.stringify aufrufen, bevor ich meine Daten sende – unnötige Boilerplate, die Sie vergessen können hinzuzufügen.
Ich habe in ajaxSetup nachgesehen, kann aber bisher keine Lösung dafür finden …
Aktualisieren
Aus einem Grund, warum ich das brauche, siehe diese Frage. Ich könnte dies auf der Serverseite beheben, aber im Moment suche ich nach einer Möglichkeit, dies auf der Clientseite zu beheben.
Wenn der Inhaltstyp Ihrer Anfrage JSON ist, sollten Sie dies nicht tun müssen.
– gustavohenke
20. Juni 2013 um 14:16 Uhr
Möglicherweise serialisieren Sie Ihre Daten ungewollt auf dem Server. Ist mir vor einiger Zeit passiert. Oder Sie müssen Ihre überprüfen responseType..wenn es “text” oder “html” hat, könnte dies passieren
– Krishwader
20. Juni 2013 um 14:17 Uhr
$.ajaxSetup({ contentType: 'json' });
– Oh Gott warum
20. Juni 2013 um 14:20 Uhr
Durch Festlegen des Inhaltstyps werden die Daten nicht in diesen Datentyp umgewandelt. Wenn es sich um ein Objekt handelt, wird jQuery es trotzdem weitergeben $.paramwodurch sie in serialisierte Daten wie z somedata=foobar&someotherdata=barfoo
– Kevin B
20. Juni 2013 um 14:24 Uhr
Nein, es gibt keine integrierte Möglichkeit, Ihre Daten von einem Objekt in JSON vorzuverarbeiten. Sie können jedoch verwenden ajaxSetup und ein beforeSend um es für dich zu tun.
Stellen Sie jetzt sicher, dass Sie Ihre einstellen contentType zu application/json bei Anfragen, die json an den Server senden müssen, damit es von der if-Anweisung abgefangen wird.
Scheint vielversprechend – nur scheint jQuery einige Dinge zu serialisieren, bevor es beforeSend aufruft. Daher rufe ich einige Funktionen () auf, die in meinem Modell someData definiert sind – ich verwende Knockout.js. Gibt es eine Möglichkeit, das zu verhindern?
– Dirk Boer
20. Juni 2013 um 14:35 Uhr
Ah, richtig, weil beforeSend passiert, NACHDEM jquery das Objekt in String-Daten konvertiert hat. beforeSend funktioniert in diesem Fall nicht, es sei denn, Sie verwenden auch processData: false
– Kevin B
20. Juni 2013 um 14:40 Uhr
processData: false funktioniert bei mir und ist ein Angebot, das ich mir leisten kann 🙂 Danke!
– Dirk Boer
20. Juni 2013 um 14:51 Uhr
Dies wäre wahrscheinlich besser als Ajax-Vorfilter geeignet.
$.ajaxPrefilter("json", function(options, originalOptions) {
options.data = JSON.stringify(originalOptions.data || null);
options.contentType = "application/json" // content type of *request*
});
$.ajax({
data: {foo: [1,2,3]},
dataType: "json" // expected content type of *response* (must match prefilter, above!)
[...]
});
Denn Vorfilter passen auf die dataType Option, müssen wir es manuell in unserer einstellen $.ajax Anfrage. Wenn die dataType mit dem Vorfilter (“json”) übereinstimmt, wird er vor dem Senden der Anfrage konvertiert data Objekt auf eine Zeichenfolge, und legen Sie die fest contentType passender Header (“application/json”).
Denken Sie daran, dass dieses aa global Veränderung, die sich auf ALLE Zukunft auswirken wird $.ajax Anfragen mit dataType: "json"!
Vielen Dank! Sie können die Innereien der Vorfilterfunktion mit umhüllen if(/POST|PUT|PATCH/.test(options.type)) { ... } um nur Anfragen mit einem Körper zu beeinflussen.
– Ryan Wheale
2. September 2016 um 1:41 Uhr
Hier ist die jQuery.prefilter Funktion, die ich verwende (sie ist besser als der BeforeSend-Ansatz), passt sie zu jedem Datentyp und serialisiert jedes Objekt in einer Post- oder Put-Anfrage.
Wenn der Inhaltstyp Ihrer Anfrage JSON ist, sollten Sie dies nicht tun müssen.
– gustavohenke
20. Juni 2013 um 14:16 Uhr
Möglicherweise serialisieren Sie Ihre Daten ungewollt auf dem Server. Ist mir vor einiger Zeit passiert. Oder Sie müssen Ihre überprüfen
responseType
..wenn es “text” oder “html” hat, könnte dies passieren– Krishwader
20. Juni 2013 um 14:17 Uhr
$.ajaxSetup({ contentType: 'json' });
– Oh Gott warum
20. Juni 2013 um 14:20 Uhr
Durch Festlegen des Inhaltstyps werden die Daten nicht in diesen Datentyp umgewandelt. Wenn es sich um ein Objekt handelt, wird jQuery es trotzdem weitergeben
$.param
wodurch sie in serialisierte Daten wie zsomedata=foobar&someotherdata=barfoo
– Kevin B
20. Juni 2013 um 14:24 Uhr