Como usar getJSON, enviando dados com método post?

107

Estou usando o método acima e funciona bem com um parâmetro no URL.

por exemplo, Students/getstud/1onde o formato do controlador / ação / parâmetro é aplicado.

Agora eu tenho uma ação no controlador de alunos que aceita dois parâmetros e retorna um objeto JSON.

Então, como faço para postar dados $.getJSON()usando o método post?

Métodos semelhantes também são aceitáveis.

O objetivo é chamar uma ação do controlador com AJAX.

Vikas
fonte
4
getem getJSONsignifica usar GET para obter algum json.
Majid Fouladpour de
1
@Majid Fouladpour Quando fiz esta pergunta, não sabia disso ..!
Vikas de

Respostas:

216

O método $ .getJSON () faz um HTTP GET e não um POST. Você precisa usar $ .post ()

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

Nessa chamada, dataToBeSentpode ser o que você quiser, embora se estiver enviando o conteúdo de um formulário html, você pode usar o método serialize para criar os dados para o POST a partir do seu formulário.

var dataToBeSent = $("form").serialize();
Erv Walter
fonte
7
Só quero adicionar que $ .getJSON suporta Jsonp (acesso entre domínios), infelizmente $ .post não.
Tomas
2
Na verdade .getJSON () oferece suporte ao acesso entre domínios de duas maneiras. JSONP, que não usa GET ou POST, mas injeção de script; mas também CORS - e .post () também suporta CORS. No entanto, o CORS requer que o servidor também o suporte, enquanto o JSONP não.
hippietrail
2
Não é verdade, JSONP também requer suporte do servidor para analisar o parâmetro de retorno de chamada.
Shrulik
Quando estou usando a função acima, estou recebendo um objeto string em vez de um objeto json.
Pratik Singhal
13

Esta é a minha solução de "uma linha":

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

Para usar jsonp e o método POST, esta função adiciona o parâmetro GET "callback" ao URL. Esta é a maneira de usá-lo:

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

O servidor deve estar preparado para lidar com o parâmetro GET de retorno de chamada e retornar a string json como:

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

em que "jsonp000000" é o valor GET de retorno de chamada.

Em PHP, a implementação seria como:

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

Eu fiz alguns testes entre domínios e parece funcionar. Ainda precisa de mais testes.

lepe
fonte
1
Isso nunca irá ignorar o limite de GET, enquanto o tamanho máximo do POST pode ser redefinido.
Dementic
Por que você adicionou ?callback? na url? Isso fez com que o callback não fosse chamado por mim. Eu também adicionei JSON.stringify(data). +1, postagem útil!
Ionică Bizău
@ IonicăBizău: obrigado. Para retornar um objeto, precisamos adicionar o parâmetro "callback" à URL e o servidor precisa retornar o mesmo nome de objeto gerado pelo JQuery. Eu também uso uma função de substituição para getJSON ():jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
lepe de
7

Basta adicionar essas linhas ao seu <script>(em algum lugar após o jQuery ser carregado, mas antes de postar qualquer coisa):

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

Substitua (alguns / todos) $.getJSONpor $.postJSONe divirta-se!

Você pode usar as mesmas funções de retorno de chamada Javascript que com $.getJSON. Nenhuma alteração do lado do servidor é necessária. (Bem, eu sempre recomendo usar $_REQUESTem PHP. Http://php.net/manual/en/reserved.variables.request.php , Entre $ _REQUEST, $ _GET e $ _POST qual é o mais rápido? )

Isso é mais simples do que a solução de @lepe.

Lerin Sonberg
fonte
Isso não funcionou com os métodos done () e fail () que você normalmente pode aplicar a getJSON.
HackWeight de
3

Eu tinha um código que estava executando getJSON. Eu simplesmente substituí por postagem. Para minha surpresa, funcionou

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

Acabei de usar post e 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!");
    });
Fusca Software
fonte
1

$.getJSON()é muito útil para enviar uma solicitação AJAX e receber dados JSON como resposta. Infelizmente, a documentação do jQuery carece de uma função irmã que deve ser nomeada $.postJSON(). Por que não usar $.getJSON()e acabar com isso? Bem, talvez você queira enviar uma grande quantidade de dados ou, no meu caso, o IE7 simplesmente não deseja funcionar corretamente com uma solicitação GET.

É verdade, atualmente não existe nenhum $.postJSON()método, mas você pode realizar a mesma coisa especificando um quarto parâmetro (tipo) na $.post()função:

Meu código era parecido com este:

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

se você tiver apenas dois parâmetros, pode fazer isso:

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

    //do something useful with returned result//
    result.variable-in-result;
});
microfone
fonte
5
Acho que essa não é a resposta ao que foi perguntado.
Harmeet Singh