Jak korzystać z getJSON, wysyłając dane metodą postu?

108

Używam powyższej metody i działa dobrze z jednym parametrem w adresie URL.

np. Students/getstud/1gdzie zastosowano format kontrolera / akcji / parametru.

Teraz mam akcję w kontrolerze Students, która akceptuje dwa parametry i zwraca obiekt JSON.

Jak więc opublikować dane $.getJSON()metodą postu?

Dopuszczalne są również podobne metody.

Chodzi o to, aby wywołać akcję kontrolera za pomocą AJAX.

Vikas
źródło
4
getw getJSONdrodze użyć GET , aby uzyskać pewne json.
Majid Fouladpour
1
@Majid Fouladpour Kiedy zadałem to pytanie, nie wiedziałem, że ..!
Vikas

Odpowiedzi:

217

Metoda $ .getJSON () wykonuje HTTP GET, a nie POST. Musisz użyć $ .post ()

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

W tym wywołaniu dataToBeSentmoże być wszystko, co chcesz, chociaż jeśli wysyłasz zawartość formularza html, możesz użyć metody serialize , aby utworzyć dane dla POST z formularza.

var dataToBeSent = $("form").serialize();
Erv Walter
źródło
7
Chcę tylko dodać, że $ .getJSON obsługuje Jsonp (dostęp między domenami), niestety $ .post nie.
Tomas
2
W rzeczywistości .getJSON () obsługuje dostęp między domenami na dwa sposoby. JSONP, który nie używa GET ani POST, ale wstrzyknięcie skryptu; ale także CORS - i .post () również obsługuje CORS. Jednak CORS wymaga, aby serwer również go obsługiwał, podczas gdy JSONP nie.
hippietrail
2
Nieprawda, JSONP wymaga również obsługi serwera w celu przeanalizowania parametru wywołania zwrotnego.
Shrulik
Kiedy używam powyższej funkcji, zamiast obiektu JSON otrzymuję obiekt typu string.
Pratik Singhal
13

Oto moje rozwiązanie „jednowierszowe”:

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

Aby użyć metody jsonp i POST, funkcja ta dodaje parametr GET „callback” do adresu URL. Oto sposób korzystania z niego:

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

Serwer musi być przygotowany do obsługi parametru GET wywołania zwrotnego i zwrócenia ciągu json jako:

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

w którym „jsonp000000” jest wartością GET wywołania zwrotnego.

W PHP implementacja wyglądałaby tak:

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

Zrobiłem kilka testów międzydomenowych i wydaje się, że działa. Nadal jednak potrzebuję więcej testów.

lepe
źródło
1
To nigdy nie spowoduje ominięcia limitu GET, podczas gdy maksymalny rozmiar POST może zostać ponownie zdefiniowany.
Dementic
Dlaczego dodałeś ?callback? w adresie URL? To sprawiło, że oddzwonienie nie było wywoływane za mnie. Dodałem też JSON.stringify(data). +1, pomocny post!
Ionică Bizău
@ IonicăBizău: dzięki. Aby zwrócić obiekt, musimy dodać parametr „callback” do adresu URL, a serwer musi zwrócić tę samą nazwę obiektu wygenerowaną przez JQuery. Używam również funkcji nadpisywania dla jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
getJSON
7

Po prostu dodaj te linie do swojego <script>(gdzieś po załadowaniu jQuery, ale przed wysłaniem czegokolwiek):

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

Wymienić (niektóre / wszystkie) $.getJSONz $.postJSONi ciesz się!

Możesz używać tych samych funkcji zwrotnych JavaScript, co w przypadku $.getJSON. Nie jest wymagana żadna zmiana po stronie serwera. (Cóż, zawsze zalecamy użycie $_REQUESTw PHP. Http://php.net/manual/en/reserved.variables.request.php , Wśród $ _REQUEST, $ _GET i $ _POST, który z nich jest najszybszy? )

Jest to prostsze niż rozwiązanie @ lepe.

Lerin Sonberg
źródło
Nie zadziałało to z metodami done () i fail (), które można normalnie zastosować do metody getJSON.
HackWeight
3

Miałem kod, który robił getJSON. Po prostu zastąpiłem go postem. Ku mojemu zdziwieniu zadziałało

   $.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
źródło
3

Właśnie użyłem postu i 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!");
    });
Oprogramowanie Fusca
źródło
1

$.getJSON()jest bardzo przydatny do wysyłania żądania AJAX i odzyskiwania danych JSON jako odpowiedzi. Niestety, w dokumentacji jQuery brakuje funkcji siostrzanej, którą należałoby nazwać $.postJSON(). Dlaczego nie po prostu go użyć $.getJSON()i skończyć z tym? Cóż, być może chcesz wysłać dużą ilość danych lub, w moim przypadku, IE7 po prostu nie chce działać poprawnie z żądaniem GET.

To prawda, obecnie nie ma $.postJSON()metody, ale możesz osiągnąć to samo, określając czwarty parametr (typ) w $.post()funkcji:

Mój kod wyglądał tak:

$.post('script.php', data, function(response) {
  // Do something with the request
}, 'json');
Tony
źródło
-8

jeśli masz tylko dwa parametry, możesz to zrobić:

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

    //do something useful with returned result//
    result.variable-in-result;
});
mic
źródło
5
myślę, że to nie jest odpowiedź na to, o co pytano.
Harmeet Singh