Як користуватися getJSON, надсилаючи дані методом post?


107

Я використовую вищевказаний метод, і він добре працює з одним параметром у URL.

наприклад, Students/getstud/1де застосовується формат контролера / дії / параметра.

Тепер у мене є дія в контролері Студент, який приймає два параметри і повертає JSON-об'єкт.

Тож як я публікую дані за $.getJSON()допомогою методу публікації?

Подібні методи також прийнятні.

Сенс полягає в виклику дії контролера з AJAX.


4
getв getJSONзасіб використовувати GET , щоб отримати JSON.
Маджід Фуладпур

1
@Majid Fouladpour Коли я задав це питання, я цього не знав ..!
Вікас

Відповіді:


216

Метод $ .getJSON () робить HTTP GET, а не POST. Вам потрібно використовувати $ .post ()

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

У цьому дзвінку dataToBeSentможе бути все, що завгодно, хоча якщо ви надсилаєте вміст HTML-форми, ви можете використовувати метод серіалізації для створення даних для POST з вашої форми.

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

7
Просто хочу додати, що $ .getJSON підтримує Jsonp (міждоменний доступ), на жаль, $ .post не.
Томаш

2
Насправді .getJSON () підтримує міждоменний доступ двома способами. JSONP, який не використовує GET або POST, а введення сценарію; але також CORS - і .post () також підтримує CORS. Однак CORS вимагає, щоб сервер також підтримував його, тоді як JSONP цього не робить.
hippietrail

2
Неправда, JSONP також вимагає підтримки сервера для розбору параметра зворотного виклику.
Шрулик

Коли я використовую вищевказану функцію, я отримую об’єкт рядка замість об'єкта json.
Пратік Сінгхал

13

Це моє "однолінійне" рішення:

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

З метою використання методу jsonp та POST, ця функція додає до URL-адреси параметру GET "зворотний виклик". Це спосіб її використання:

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

Сервер повинен бути готовим обробляти параметр GET зворотного виклику та повертати рядок json у вигляді:

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

в якому "jsonp000000" - значення GET зворотного виклику.

У PHP реалізація виглядає так:

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

Я зробив кілька крос-доменних тестів, і, здається, це працює. Ще потрібно більше тестування.


1
Це ніколи не обійде межу, яку GET має, поки максимальний розмір POST можна буде переосмислити.
Дементік

Чому ви додали ?callback? в URL? Це призвело до того, що зворотний дзвінок для мене не називався. Я також додав JSON.stringify(data). +1, корисна публікація!
Ionică Bizău

@ IonicăBizău: спасибі. Для того, щоб повернути об’єкт, нам потрібно додати параметр "зворотний виклик" до URL-адреси, і сервер повинен повернути те саме ім'я об'єкта, що генерується JQuery. Я також використовувати функцію перевизначення для getJSON ():jQuery.getJSON = function(url, data, func) { return $.get(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); }
Lepe

7

Просто додайте ці рядки до свого <script>(десь після завантаження jQuery, але перед тим, як щось опублікувати):

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

Замініть (деякі / всі) $.getJSONна $.postJSONі насолоджуйтесь!

Ви можете використовувати ті самі функції зворотного виклику Javascript, що і для $.getJSON. Не потрібні зміни на стороні сервера. (Ну, я завжди рекомендую використовувати $_REQUESTв PHP. Http://php.net/manual/en/reserved.variables.request.php , Серед $ _REQUEST, $ _GET та $ _POST, який з них найшвидший? )

Це простіше, ніж рішення @ lepe.


Це не працювало з методами done () і fail (), які ви можете звичайно застосувати до getJSON.
HackWeight

3

У мене був код, який робив getJSON. Я просто замінив його посадою. На мій подив, це спрацювало

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

Я щойно використав пост і якщо:

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()досить зручна для надсилання запиту AJAX та повернення даних JSON як відповіді. На жаль, у документації jQuery відсутня сестринська функція, яку слід назвати $.postJSON(). Чому б не просто використовувати$.getJSON() і зробити це з ним? Ну, можливо, ви хочете надіслати велику кількість даних, або, в моєму випадку, IE7 просто не хоче працювати належним чином із запитом GET.

Це правда, в даний час немає $.postJSON()способу, але ви можете виконати те саме, вказавши в функції четвертий параметр (тип) $.post():

Мій код виглядав так:

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

-8

якщо у вас всього два параметри, ви можете це зробити:

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

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

5
Я думаю, що це не відповідь на запитання.
Harmeet Singh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.