Как использовать getJSON для отправки данных методом post?


108

Я использую вышеуказанный метод, и он хорошо работает с одним параметром в URL-адресе.

например, Students/getstud/1где применяется формат контроллера / действия / параметра.

Теперь у меня есть действие в контроллере Student, которое принимает два параметра и возвращает объект JSON.

Итак, как мне опубликовать данные с $.getJSON()помощью метода публикации?

Допустимы и аналогичные методы.

Дело в том, чтобы вызвать действие контроллера с помощью AJAX.


4
getin getJSONозначает использование GET, чтобы получить json.
Majid Fouladpour

1
@Majid Fouladpour Когда я задал этот вопрос, я не знал этого ..!
Vikas

Ответы:


217

Метод $ .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 нет.
Tomas

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

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

Когда я использую указанную выше функцию, я получаю строковый объект вместо объекта json.
Pratik Singhal

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 может быть переопределен.
Dementic

Зачем добавили ?callback? в URL? Это сделало обратный звонок не для меня. Я тоже добавил JSON.stringify(data). +1, полезный пост!
Ionică Bizău 08

@ 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. Никаких изменений на стороне сервера не требуется. (Что ж, я всегда рекомендую использовать $_REQUESTPHP. 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.