it-swarm.com.de

Rufen Sie JSON.stringify immer in den Postdaten für jQuery Ajax auf

Oder eine andere Funktion, um Ihre Daten für diese Angelegenheit vorzubereiten :)

Aufgrund meines serverseitigen Frameworks muss ich vor dem Senden meiner Daten immer JSON.stringify aufrufen. Dies ist eine unnötige Boilerplate, die Sie vergessen können, um sie hinzuzufügen.

Gerade habe ich:

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

Ich würde bevorzugen:

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

Ich habe mir ajaxSetup angeschaut, konnte aber bisher keine Lösung dafür finden ...

Update

Für einen Grund, warum ich das brauche, siehe folgende 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.

22
Dirk Boer

Nein, es gibt keine integrierte Möglichkeit, Ihre Daten von einem Objekt zu JSON vorzuverarbeiten. Sie können jedoch ajaxSetup und eine beforeSend verwenden, um dies für Sie auszuführen.

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

Stellen Sie nun sicher, dass Sie Ihre contentType auf application/json für Anforderungen setzen, die json an den Server senden müssen, damit sie von der if-Anweisung erfasst werden.

27
Kevin B

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

$.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!)
  [...]
});

Da Vorfilter mit der Option dataType übereinstimmen, müssen wir sie in unserer $.ajax-Anforderung manuell einstellen. Wenn dataType mit dem Vorfilter ("json") übereinstimmt, wird das data-Objekt vor dem Senden der Anforderung in eine Zeichenfolge konvertiert und der contentType-Header entsprechend ("application/json") gesetzt.

Beachten Sie, dass dies eine Änderung von global ist, die sich auf ALLE zukünftigen $.ajax-Anforderungen mit dataType: "json" auswirkt!

2
nathanallen

Hier ist die Funktion jQuery.prefilter , die ich verwende (sie ist besser als die Methode beforeSend), sie passt zu jedem Datentyp und serialisiert jedes Objekt in einer Post- oder Put-Anforderung.

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

0
Chtiwi Malek