Используя jquery для создания POST, как правильно указать параметр "данные"?

Я хотел бы сделать ajax-вызов как POST, и он отправится на мой сервлет. Я хочу отправить параметризованные данные, например:

var mydata = 'param0=some_text&param1=some_more_text';

Я предоставляю это как параметр data для моего jquery ajax(). Так что это должно быть вставлено в тело POST, верно? (Я имею в виду, не прилагается к моему "mysite/save" url?):

$.ajax({
    url: 'mysite/save',
    type: 'POST',
    data: mydata
});

он работает правильно. В моем сервлете я просто сбрасываю все полученные параметры, и я вижу, что все они проходят через красиво:

private void printParams(HttpServletRequest req) {
    Enumeration paramNames = req.getParameterNames();
    while (paramNames.hasMoreElements()) { 
        // print each param key/val here.
    }
}

Кроме того, я должен сначала закодировать мою строку данных вручную перед использованием, правильно? Как:

var mydata = 'param0=' + urlencode('hi there!');
mydata += '&param1=' + urlencode('blah blah');
mydata += '%param2=' + urlencode('we get it');

Спасибо!

Ответ 1

Более простой способ - предоставить свойство data как объект, например:

$.ajax({
  url: 'mysite/save',
  type: 'POST',
  data: { param0:'hi there!', param1:'blah blah', param2:'we get it' }
});

В противном случае, да, вы должны закодировать его, так как что-либо с &, например, очень быстро повредило бы вещи. Предоставление его как объекта является гораздо более простым или более простым, хотя, на мой взгляд, в любом случае.

Вы также можете выделить его и получить свойства из других мест, например:

$.ajax({
  url: 'mysite/save',
  type: 'POST',
  data: { 
          param0: $('#textbox0').val(), 
          param1: $('#textbox1').val(), 
          param2: $('#textbox2').val()
        }
});

Edit: Если вам интересно, как jQuery делает эту кодировку внутри, она использует $.param() (которую вы также можете использовать напрямую) для кодирования объекта в строку, называемую здесь, а кишки здесь.

Ответ 2

Если у вас есть форма, вы также можете сделать var data = jQuery("#myForm").serialize();, который помещает ее в форму, которую jQuery.ajax может понять и использовать. В противном случае используйте литерал объекта, описанный в ответе Ника.

Ответ 3

может это вам помочь

function CallPageSync(url, data) {
    var response;
    $.ajax({
        async: false,
        url: url,
        data: data,
        timeout: 4000,
        success: function(result) {
            response = result;
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            response = "err--" + XMLHttpRequest.status + " -- " + XMLHttpRequest.statusText;
        }
    });
    return response;
}

и вы можете называть его как

response = CallPageSync(checkPageURL, "un=" + username);

Ответ 4

Вам нужна эта часть:

data: JSON.stringify({
    BarcodeNumber: $('#shipmentId-input').val(),
    StatusId: $('[name="StatusId"]').val()
}),

Полный объект:

$.ajax(
    {
        url: "/Agent/Shipment/BulkUpdate",
        method: "POST",
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify({
            BarcodeNumber: $('#shipmentId-input').val(),
            StatusId: $('[name="StatusId"]').val()
        }),
        success: function (data, textStatus, jqXHR) {
            if (textStatus== "success") {
                alert(data);
                // Handel success
            }
            else {
                // Handel response error
            }
        },
        error: function (jqXHR, textStatus, errorThrown){
              //Handel connection error
            }
        });

Ответ 5

Вам не нужно кодировать POST-переменные URL. Однако, если вы взаимодействуете с базой данных, вам нужно будет убедиться, что ваши переменные защищены от наложения инъекций.

То, что у вас есть, будет работать, но как Vivin, если это форма, лучший способ сделать это - через .serialize().

Я использую это LOT лично для всех моих представлений формы (выполняется через .ajax()).