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.