Как передать параметры в $ ajax POST?


135

Я следовал за учебником, как указано в этой ссылке. В приведенном ниже коде по какой-то причине данные не добавляются к URL-адресу в качестве параметров, но если я установлю их непосредственно на URL-адрес, /?field1="hello"он будет работать.

$.ajax({
        url: 'superman',
        type: 'POST',
        data: { field1: "hello", field2 : "hello2"} ,
        contentType: 'application/json; charset=utf-8',
        success: function (response) {
            alert(response.status);
        },
        error: function () {
            alert("error");
        }
    }); 

8
Если вы хотите, чтобы ваши параметры были добавлены к URL-адресу, вам нужно изменить тип на «GET». Вместо этого POST передает параметры в заголовки HTTP.
ограбить

Ответы:


126

Я бы порекомендовал вам использовать $.postили $.getсинтаксис jQuery для простых случаев:

$.post('superman', { field1: "hello", field2 : "hello2"}, 
    function(returnedData){
         console.log(returnedData);
});

Если вам нужно отловить ошибки, просто сделайте это:

$.post('superman', { field1: "hello", field2 : "hello2"}, 
    function(returnedData){
         console.log(returnedData);
}).fail(function(){
      console.log("error");
});

Кроме того, если вы всегда отправляете строку JSON, вы можете использовать $ .getJSON или $ .post с еще одним параметром в самом конце.

$.post('superman', { field1: "hello", field2 : "hello2"}, 
     function(returnedData){
        console.log(returnedData);
}, 'json');

1
Более новые версии jQuery поддерживают «подвешивание» обработчиков done (), fail () или always () над $ .post и $ .get. См .: api.jquery.com/jQuery.post
CyberMonk

что есть field1:и что есть "hello"? Переменные в JS или PHP?
MTBthePRO

field1 и field2 являются переменными POST. Hello и Hello2 являются их значением.
Альваро

57

Попробуйте использовать метод GET,

var request = $.ajax({
    url: 'url',
    type: 'GET',
    data: { field1: "hello", field2 : "hello2"} ,
    contentType: 'application/json; charset=utf-8'
});

request.done(function(data) {
      // your success code here
});

request.fail(function(jqXHR, textStatus) {
      // your failure code here
});

Вы не можете видеть параметры в URL с методом POST.

Редактировать:

Примечание об устаревании : обратные вызовы jqXHR.success (), jqXHR.error () и jqXHR.complete () удалены с jQuery 3.0. Вместо этого вы можете использовать jqXHR.done (), jqXHR.fail () и jqXHR.always ().


53

Jquery.ajax не кодирует данные POST для вас автоматически, как это делается для данных GET. Jquery ожидает, что ваши данные будут предварительно отформатированы для добавления к телу запроса, которое будет отправлено непосредственно по сети.

Решением является использование функции jQuery.param для построения строки запроса, которую ожидает большинство сценариев, обрабатывающих запросы POST.

$.ajax({
    url: 'superman',
    type: 'POST',
    data: jQuery.param({ field1: "hello", field2 : "hello2"}) ,
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
    success: function (response) {
        alert(response.status);
    },
    error: function () {
        alert("error");
    }
}); 

В этом случае paramметод форматирует данные в:

field1=hello&field2=hello2

В документации Jquery.ajax говорится, что существует флаг, processDataкоторый определяет, выполняется ли эта кодировка автоматически или нет. Документация говорит, что по умолчанию true, но это не то поведение, которое я наблюдаю при POSTиспользовании.


7
Я думаю, что это единственный ответ, который объясняет «почему».
Чжоуцзи

15
    function FillData() {
    var param = $("#<%= TextBox1.ClientID %>").val();
    $("#tbDetails").append("<img src='Images/loading.gif'/>");
    $.ajax({
        type: "POST",/*method type*/
        contentType: "application/json; charset=utf-8",
        url: "Default.aspx/BindDatatable",/*Target function that will be return result*/
        data: '{"data":"' + param + '"}',/*parameter pass data is parameter name param is value */
        dataType: "json",
        success: function(data) {
               alert("Success");
            }
        },
        error: function(result) {
            alert("Error");
        }
    });   
}

11

В запросе POST параметры отправляются в теле запроса, поэтому вы не видите их в URL.

Если вы хотите их увидеть, поменяйте

    type: 'POST',

в

    type: 'GET',

Обратите внимание, что в браузерах есть инструменты разработки, которые позволяют вам видеть полные запросы, которые выдает ваш код. В Chrome он находится на панели «Сеть».


8
$.ajax(
   {
      type: 'post',
      url: 'superman',
      data: { 
        "field1": "hello",
        "field2": "hello1"
      },
      success: function (response) {
        alert("Success !!");
      },
      error: function () {
        alert("Error !!");
      }
   }
);

type: 'POST', добавит ** параметры к телу запроса **, которого нет в URL, пока type: 'GET'добавляет параметры к видимому URL .

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

В сетевой панели выберите XHR, чтобы увидеть запросы .

Это также может быть сделано через это.

$.post('superman',
      { 
        'field1': 'hello', 
        'field2': 'hello1'
      },
      function (response) {
        alert("Success !");
      }
    );

6

Вы можете сделать это используя $ .ajax или $ .post

Используя $ .ajax:

    $.ajax({
      type: 'post',
      url: 'superman',
      data: { 
        'field1': 'hello', 
        'field2': 'hello1'
      },
      success: function (response) {
        alert(response.status);
      },
      error: function () {
        alert("error");
      }
   });

Используя $ .post:

    $.post('superman',
      { 
        'field1': 'hello', 
        'field2': 'hello1'
      },
      function (response, status) {
        alert(response.status);
      }
    );

Большое спасибо - это работает. Тем не менее, было бы здорово, если бы вы могли добавить пример, который вызывает функцию для получения параметров записи. Спасибо! :)
gies0r

3

Ваш код был правильным, за исключением того, что вы не передаете ключи JSON в виде строк.

Он должен иметь двойные или одинарные кавычки

{"field1": "hello", "field2": "hello2"}

$.ajax(
   {
      type: 'post',
      url: 'superman',
      data: { 
        "field1": "hello", // Quotes were missing
        "field2": "hello1" // Here also
      },
      success: function (response) {
        alert(response);
      },
      error: function () {
        alert("error");
      }
   }
);

0

Для отправки параметров в URL в POSTметоде Вы можете просто добавить его к URL следующим образом:

$.ajax({
    type: 'POST',
    url: 'superman?' + jQuery.param({ f1: "hello1", f2 : "hello2"}),
    // ...
}); 

2
Если спрашивающий просто хотел отправить некоторые параметры через POST, другие ответы были бы более уместными, поскольку это было бы более стандартным. Вопрос явно упоминает параметры POST и URL. (Например, я нашел этот вопрос, потому что я должен установить параметры URL вместе с теми, что в теле, и я хотел бы сделать это более хорошим способом, чем объединение строк.) @ User4127 примите это как ответ или переформулируйте свой вопрос, пожалуйста.
Ян Молнар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.