Wie verwende ich getJSON, um Daten mit der Post-Methode zu senden?


107

Ich verwende die obige Methode und sie funktioniert gut mit einem Parameter in der URL.

zB Students/getstud/1wo Controller / Action / Parameter Format angewendet wird.

Jetzt habe ich eine Aktion im Students-Controller, die zwei Parameter akzeptiert und ein JSON-Objekt zurückgibt.

Wie poste ich Daten mit der $.getJSON()Post-Methode?

Ähnliche Methoden sind auch akzeptabel.

Der Punkt ist, eine Aktion des Controllers mit AJAX aufzurufen.


4
getin getJSONMittel GET verwenden einige Json zu bekommen.
— Majid Fouladpour

1
@Majid Fouladpour Als ich diese Frage stellte, wusste ich nicht, dass ..!
— Vikas

Antworten:


216

Die $ .getJSON () -Methode führt ein HTTP-GET und kein POST durch. Sie müssen $ .post () verwenden

$.post(url, dataToBeSent, function(data, textStatus) {
  //data contains the JSON object
  //textStatus contains the status: success, error, etc
}, "json");

Dieser Aufruf kann dataToBeSentbeliebig sein. Wenn Sie jedoch den Inhalt eines HTML-Formulars senden, können Sie die Serialisierungsmethode verwenden, um die Daten für den POST aus Ihrem Formular zu erstellen.

var dataToBeSent = $("form").serialize();

7
Ich möchte nur hinzufügen, dass $ .getJSON Jsonp (domänenübergreifender Zugriff) unterstützt, leider $ .post nicht.
— Tomas

2
Tatsächlich unterstützt .getJSON () den domänenübergreifenden Zugriff auf zwei Arten. JSONP, das kein GET oder POST verwendet, sondern eine Skriptinjektion; aber auch CORS - und .post () unterstützen auch CORS. CORS erfordert jedoch, dass der Server dies ebenfalls unterstützt, JSONP jedoch nicht.
— Hippietrail

2
Nicht wahr, JSONP benötigt auch Serverunterstützung, um den Rückrufparameter zu analysieren.
— Shrulik

Wenn ich die obige Funktion verwende, erhalte ich ein String-Objekt anstelle eines JSON-Objekts.
— Pratik Singhal

13

Dies ist meine "einzeilige" Lösung:

$.postJSON = function(url, data, func) { $.post(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }

Um die jsonp- und POST-Methode zu verwenden, fügt diese Funktion der URL den Parameter "callback" GET hinzu. Dies ist die Art und Weise, wie Sie es verwenden:

$.postJSON("http://example.com/json.php",{ id : 287 }, function (data) {
   console.log(data.name);
});

Der Server muss darauf vorbereitet sein, den Rückruf-GET-Parameter zu verarbeiten und die JSON-Zeichenfolge wie folgt zurückzugeben:

jsonp000000 ({"name":"John", "age": 25});

in dem "jsonp000000" der Rückruf-GET-Wert ist.

In PHP wäre die Implementierung wie folgt:

print_r($_GET['callback']."(".json_encode($myarr).");");

Ich habe einige domänenübergreifende Tests durchgeführt und es scheint zu funktionieren. Ich brauche noch mehr Tests.


1
Dies wird niemals das Limit umgehen, das GET hat, während die maximale Größe des POST neu definiert werden kann.
— Dementic

Warum hast du hinzugefügt ?callback? in url? Das machte den Rückruf nicht für mich angerufen. Ich habe auch hinzugefügt JSON.stringify(data). +1, hilfreicher Beitrag!
— Ionică Bizău

@ IonicăBizău: Danke. Um ein Objekt zurückzugeben, müssen wir der URL den Parameter "Rückruf" hinzufügen, und der Server muss denselben von JQuery generierten Objektnamen zurückgeben. Ich benutze auch eine Override-Funktion für getJSON ():jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
— Lepe

7

Fügen Sie diese Zeilen einfach zu Ihrer hinzu <script>(irgendwo nachdem jQuery geladen wurde, aber bevor Sie etwas veröffentlichen):

$.postJSON = function(url, data, func)
{
    $.post(url, data, func, 'json');
}

Ersetzen Sie (einige / alle) $.getJSONdurch $.postJSONund genießen Sie!

Sie können dieselben Javascript-Rückruffunktionen wie bei verwenden $.getJSON. Es ist keine serverseitige Änderung erforderlich. (Na ja, ich mit immer empfehlen , $_REQUESTin PHP. Http://php.net/manual/en/reserved.variables.request.php , unter $ _REQUEST, $ _GET und $ _POST , die eine der am schnellsten ist? )

Dies ist einfacher als die Lösung von @ lepe.


Dies funktionierte nicht mit den Methoden done () und fail (), die Sie normalerweise auf getJSON anwenden können.
— HackWeight

3

Ich hatte Code, der getJSON ausführte. Ich habe es einfach durch Post ersetzt. Zu meiner Überraschung hat es funktioniert

   $.post("@Url.Action("Command")", { id: id, xml: xml })
      .done(function (response) {
           // stuff
        })
        .fail(function (jqxhr, textStatus, error) {
           // stuff
        });



    [HttpPost]
    public JsonResult Command(int id, string xml)
    {
          // stuff
    } 

3

Ich habe gerade Post und ein Wenn verwendet:

data = getDataObjectByForm(form);
var jqxhr = $.post(url, data, function(){}, 'json')
    .done(function (response) {
        if (response instanceof Object)
            var json = response;
        else
            var json = $.parseJSON(response);
        // console.log(response);
        // console.log(json);
        jsonToDom(json);
        if (json.reload != undefined && json.reload)
            location.reload();
        $("body").delay(1000).css("cursor", "default");
    })
    .fail(function (jqxhr, textStatus, error) {
        var err = textStatus + ", " + error;
        console.log("Request Failed: " + err);
        alert("Fehler!");
    });

1

$.getJSON()ist sehr praktisch, um eine AJAX-Anfrage zu senden und JSON-Daten als Antwort zurückzugewinnen. Leider fehlt der jQuery-Dokumentation eine Schwesterfunktion, die benannt werden sollte $.postJSON(). Warum nicht einfach benutzen$.getJSON() und damit fertig sein? Nun, vielleicht möchten Sie eine große Datenmenge senden, oder in meinem Fall möchte IE7 mit einer GET-Anfrage einfach nicht richtig funktionieren.

Es gibt zwar derzeit keine $.postJSON()Methode, aber Sie können dasselbe erreichen, indem Sie einen vierten Parameter (Typ) in der$.post() Funktion angeben:

Mein Code sah folgendermaßen aus:

$.post('script.php', data, function(response) {
  // Do something with the request
}, 'json');

-8

Wenn Sie nur zwei Parameter haben, können Sie dies tun:

$.getJSON('/url-you-are-posting-to',data,function(result){

    //do something useful with returned result//
    result.variable-in-result;
});

5
Ich denke, dies ist nicht die Antwort auf die Frage.
— Harmeet Singh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.