Rufen Sie immer JSON.stringify für Post-Daten für jQuery Ajax auf

Lesezeit: 3 Minuten

Benutzer-Avatar
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.

Gerade habe ich:

$.ajax({
    [...]
    data: JSON.stringify({ someData: self.someData }),
    [...]
});

Ich würde bevorzugen:

$.ajax({
    [...]
    data: { someData: self.someData },
    [...]
});

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.

$.ajaxSetup({
    beforeSend: function(jqXHR,options){
        if ( options.contentType == "application/json" && typeof options.data != "string" ) {
            options.data = JSON.stringify(options.data);
        }
    }
});

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.

    – Kevin B

    15. Januar 2014 um 16:28 Uhr

Benutzer-Avatar
Nathanallen

Hier ein alternativer Ansatz, der a verwendet jQuery.prefilter:

$.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.

$.ajaxPrefilter(function (options, org) {
    var rtype = options.type.toLowerCase();
    if ((rtype === "post" || rtype === "put") && org.data !== null && typeof org.data === 'object') {
        options.data = JSON.stringify(org.data);
    }
});

hoffe das hilft.

Benutzer Jquery.getJSON(). Sie können JSON-Daten direkt abrufen.

$.getJSON('', function(data) {

//you can use data.
});

http://api.jquery.com/jQuery.getJSON/

1116000cookie-checkRufen Sie immer JSON.stringify für Post-Daten für jQuery Ajax auf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy