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.