Come utilizzare getJSON, inviando dati con il metodo post?


107

Sto usando il metodo sopra e funziona bene con un parametro nell'URL.

ad esempio, Students/getstud/1dove viene applicato il formato controller / azione / parametro.

Ora ho un'azione nel controller Studenti che accetta due parametri e restituisce un oggetto JSON.

Allora come inserisco i dati $.getJSON()utilizzando il metodo di pubblicazione?

Sono accettabili anche metodi simili.

Il punto è chiamare un'azione del controller con AJAX.


4
getin getJSONsignifica utilizzare GET per ottenere alcuni json.
Majid Fouladpour

1
@Majid Fouladpour Quando ho posto questa domanda, non lo sapevo ..!
Vikas

Risposte:


216

Il metodo $ .getJSON () esegue un HTTP GET e non un POST. Devi usare $ .post ()

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

In quella chiamata, dataToBeSentpotrebbe essere qualsiasi cosa tu voglia, anche se se stai inviando il contenuto di un modulo html, puoi usare il metodo serialize per creare i dati per il POST dal tuo modulo.

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

7
Voglio solo aggiungere che $ .getJSON supporta Jsonp (accesso interdominio) purtroppo $ .post no.
Tomas

2
In realtà .getJSON () supporta l'accesso interdominio in due modi. JSONP, che non utilizza GET o POST ma script injection; ma anche CORS - e .post () supporta anche CORS. Tuttavia CORS richiede che anche il server lo supporti mentre JSONP no.
Hippietrail

2
Non è vero, JSONP richiede anche il supporto del server per analizzare il parametro di callback.
Shrulik

Quando utilizzo la funzione precedente, ricevo un oggetto stringa invece di un oggetto json.
Pratik Singhal

13

Questa è la mia soluzione "una riga":

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

Per utilizzare jsonp e il metodo POST, questa funzione aggiunge il parametro GET "callback" all'URL. Questo è il modo per usarlo:

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

Il server deve essere preparato per gestire il parametro GET di callback e restituire la stringa json come:

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

in cui "jsonp000000" è il valore GET della richiamata.

In PHP l'implementazione sarebbe come:

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

Ho fatto alcuni test interdominio e sembra funzionare. Tuttavia, sono ancora necessari ulteriori test.


1
Questo non supererà mai il limite di GET mentre la dimensione massima del POST può essere ridefinita.
Demenza

Perché hai aggiunto ?callback? nell'url? Questo ha fatto sì che la richiamata non fosse chiamata per me. Ho anche aggiunto JSON.stringify(data). +1, post utile!
Ionică Bizău

@ IonicăBizău: grazie. Per restituire un oggetto, dobbiamo aggiungere il parametro "callback" all'URL e il server deve restituire lo stesso nome oggetto generato da JQuery. Uso anche una funzione di override per getJSON ():jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
lepe

7

Basta aggiungere queste righe al tuo <script>(da qualche parte dopo che jQuery è stato caricato ma prima di pubblicare qualsiasi cosa):

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

Sostituisci (alcuni / tutti) $.getJSONcon $.postJSONe divertiti!

È possibile utilizzare le stesse funzioni di callback Javascript di $.getJSON. Non è necessaria alcuna modifica lato server. (Beh, vi consiglio di usare sempre $_REQUESTin PHP. Http://php.net/manual/en/reserved.variables.request.php , tra $ _REQUEST, $ _GET e $ _POST che uno è il più veloce? )

Questa è più semplice della soluzione di @ lepe.


Questo non ha funzionato con i metodi done () e fail () che normalmente puoi applicare a getJSON.
HackWeight

3

Avevo codice che stava facendo getJSON. L'ho semplicemente sostituito con post. Con mia grande sorpresa, ha funzionato

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

Ho appena usato post e un if:

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()è molto utile per inviare una richiesta AJAX e recuperare i dati JSON come risposta. Purtroppo, la documentazione di jQuery manca di una funzione sorella che dovrebbe essere nominata $.postJSON(). Perché non basta usare$.getJSON() e basta? Beh, forse vuoi inviare una grande quantità di dati o, nel mio caso, IE7 semplicemente non vuole funzionare correttamente con una richiesta GET.

È vero, attualmente non esiste un $.postJSON()metodo, ma puoi ottenere la stessa cosa specificando un quarto parametro (tipo) nella $.post()funzione:

Il mio codice aveva questo aspetto:

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

-8

se hai solo due parametri puoi farlo:

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

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

5
Penso che questa non sia la risposta a quanto è stato chiesto.
Harmeet Singh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.