¿Cómo usar getJSON, enviando datos con el método de publicación?

107

Estoy usando el método anterior y funciona bien con un parámetro en la URL.

por ejemplo, Students/getstud/1donde se aplica el formato controlador / acción / parámetro.

Ahora tengo una acción en el controlador de Estudiantes que acepta dos parámetros y devuelve un objeto JSON.

Entonces, ¿cómo publico datos con el $.getJSON()método de publicación?

También se aceptan métodos similares.

El punto es llamar a una acción del controlador con AJAX.

Vikas
fuente
4
getin getJSONsignifica usar GET para obtener json.
Majid Fouladpour
1
@Majid Fouladpour Cuando hice esta pregunta, ¡no sabía eso ...!
Vikas

Respuestas:

216

El método $ .getJSON () realiza un HTTP GET y no un POST. Necesitas usar $ .post ()

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

En esa llamada, dataToBeSentpodría ser cualquier cosa que desee, aunque si está enviando el contenido de un formulario html, puede usar el método serializar para crear los datos para el POST desde su formulario.

var dataToBeSent = $("form").serialize();
Erv Walter
fuente
7
Solo quiero agregar que $ .getJSON soporte Jsonp (acceso entre dominios) desafortunadamente $ .post no.
Tomas
2
En realidad .getJSON () admite el acceso entre dominios de dos formas. JSONP, que no usa GET o POST sino inyección de script; pero también CORS - y .post () también es compatible con CORS. Sin embargo, CORS requiere que el servidor también lo admita, mientras que JSONP no lo hace.
hippietrail
2
No es cierto, JSONP también requiere soporte del servidor para analizar el parámetro de devolución de llamada.
Shrulik
Cuando uso la función anterior, recibo un objeto de cadena en lugar de un objeto json.
Pratik Singhal
13

Esta es mi solución de "una línea":

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

Para usar jsonp y el método POST, esta función agrega el parámetro GET "callback" a la URL. Esta es la forma de usarlo:

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

El servidor debe estar preparado para manejar el parámetro GET de devolución de llamada y devolver la cadena json como:

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

en el que "jsonp000000" es el valor GET de devolución de llamada.

En PHP, la implementación sería como:

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

Hice algunas pruebas entre dominios y parece funcionar. Sin embargo, todavía necesito más pruebas.

lepe
fuente
1
Esto nunca pasará por alto el límite que tiene GET, mientras que el tamaño máximo de POST se puede redefinir.
Dementic
¿Por qué agregaste ?callback? en url? Eso hizo que la devolución de llamada no fuera llamada por mí. También agregué JSON.stringify(data). +1, publicación útil!
Ionică Bizău
@ IonicăBizău: gracias. Para devolver un objeto, debemos agregar el parámetro "callback" a la URL y el servidor debe devolver el mismo nombre de objeto generado por JQuery. También uso una función de anulación para getJSON ():jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
lepe
7

Simplemente agregue estas líneas a su <script>(en algún lugar después de que se cargue jQuery pero antes de publicar cualquier cosa):

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

¡Reemplaza (algunos / todos) $.getJSONcon $.postJSONy disfruta!

Puede utilizar las mismas funciones de devolución de llamada de Javascript que con $.getJSON. No se necesita ningún cambio del lado del servidor. (Bueno, siempre recomienda el uso $_REQUESTen PHP. Http://php.net/manual/en/reserved.variables.request.php , Entre $ _REQUEST, $ _GET y $ _POST cuál es el más rápido? )

Esto es más simple que la solución de @ lepe.

Lerin Sonberg
fuente
Esto no funcionó con los métodos done () y fail () que normalmente puede aplicar a getJSON.
HackWeight
3

Tenía un código que estaba haciendo getJSON. Simplemente lo reemplacé con publicación. Para mi sorpresa, funcionó

   $.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
    } 
Stan Bashtavenko
fuente
3

Solo usé publicación y 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!");
    });
Software Fusca
fuente
1

$.getJSON()es bastante útil para enviar una solicitud AJAX y recuperar datos JSON como respuesta. Por desgracia, la documentación de jQuery carece de una función hermana que debería nombrarse $.postJSON(). ¿Por qué no usarlo $.getJSON()y terminar? Bueno, tal vez desee enviar una gran cantidad de datos o, en mi caso, IE7 simplemente no quiere funcionar correctamente con una solicitud GET.

Es cierto, actualmente no hay ningún $.postJSON()método, pero puede lograr lo mismo especificando un cuarto parámetro (tipo) en la $.post()función:

Mi código se veía así:

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

si solo tiene dos parámetros, puede hacer esto:

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

    //do something useful with returned result//
    result.variable-in-result;
});
micrófono
fuente
5
Creo que esta no es la respuesta a lo que se ha preguntado.
Harmeet Singh