Подтвердить что ты не робот

Как сделать POST массив объектов с $.ajax(jQuery или Zepto)

Я хотел бы POST массив объектов с $.ajax в Zepto или JQuery. Оба имеют одинаковую нечетную ошибку, но я не могу найти то, что я делаю неправильно.

Данные сохраняются на сервере при отправке с использованием тестового клиента, такого как "RestEasy", и я вижу, как запрос обрабатывается в панели net-браузера, поэтому я считаю, что JS является виновником.

Если я отправляю массив объектов в качестве свойства данных POST, они не отправляются должным образом.

Объект данных:

var postData = [
    { "id":"1", "name":"bob"}
  , { "id":"2", "name":"jonas"}
  ]

Запрос:

$.ajax({
  url: _saveDeviceUrl
, type: 'POST'
, contentType: 'application/json'
, dataType: 'json'
, data: postData
, success: _madeSave.bind(this)
//, processData: false //Doesn't help
});

Запросить тело, как показано в браузере:

"bob=undefined&jonas=undefined"

Это можно увидеть более непосредственно, используя метод $.param, который используется как jQuery, так и Zepto для подготовки данных POST.

$.param(
  [
    { "id":"1", "name":"bob"}
  , { "id":"2", "name":"jonas"}
  ]
)
// Output: "bob=undefined&jonas=undefined"

Итак, похоже, что подготовка, которую эти библиотеки выполняют для сложных почтовых данных, отличается от того, что я ожидаю.

Я вижу этот ответ, но я не хочу отправлять данные в качестве параметра запроса, так как я получаю много контента. Как отправить массив в сообщение .ajax с помощью jQuery?

Каков правильный способ отправки нескольких объектов через POST с помощью jQuery/Zepto?

Использование $.ajax({... data: JSON.stringify(postData)...}) отправляет неповрежденное содержимое, но сервер не любит формат.

Update: Похоже, что JSON.stringify отправляет правильно отформатированный контент. Проблема в том, что серверная сторона очень и очень специфична в отношении структуры объекта, который он хочет. Если я добавлю или удалю какие-либо свойства из объекта, это приведет к сбою всего процесса, а не к свойствам, которые соответствуют. Это неудобно, потому что приятно использовать сервер-отправленное содержимое в качестве модели представления, но модели просмотра меняются. ... Все еще работаем над лучшим решением.

4b9b3361

Ответ 1

Перед отправкой обязательно stringify. Я слишком много наклонялся к библиотекам и думал, что они будут правильно кодироваться на основе контента, который я публиковал, но они не выглядят.

Работает:

$.ajax({
    url: _saveAllDevicesUrl
,   type: 'POST'
,   contentType: 'application/json'
,   data: JSON.stringify(postData) //stringify is important
,   success: _madeSave.bind(this)
});

Я предпочитаю этот метод использовать плагин как $.toJSON, хотя это и делает то же самое.

Ответ 2

Попробуйте следующее:

$.ajax({
  url: _saveDeviceUrl
, type: 'POST'
, contentType: 'application/json'
, dataType: 'json'
, data: {'myArray': postData}
, success: _madeSave.bind(this)
//, processData: false //Doesn't help
});

Ответ 3

edit: Я думаю, теперь стало безопасным использовать собственный метод JSON.stringify(), поддерживается большинство браузеров (да, даже IE8 +, если вам интересно).

Проще, чем:

JSON.stringify(yourData)

Вы должны закодировать данные в JSON перед отправкой, вы не можете просто отправить такой объект как данные POST.

Я рекомендую использовать jQuery json plugin для этого. Затем вы можете использовать что-то вроде этого в jQuery:

$.post(_saveDeviceUrl, {
    data : $.toJSON(postData)
}, function(response){
    //Process your response here
}
);

Ответ 4

Проверьте этот пример публикации массива различных типов

function PostArray() {
    var myObj = [
        { 'fstName': 'name 1', 'lastName': 'last name 1', 'age': 32 }
      , { 'fstName': 'name 2', 'lastName': 'last name 1', 'age': 33 }
    ];

    var postData = JSON.stringify({ lst: myObj });
    console.log(postData);

    $.ajax({
        type: "POST",
        url: urlWebMethods + "/getNames",
        data: postData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            alert(response.d);
        },
        failure: function (msg) {
            alert(msg.d);
        }
    });
}

Если вы используете WebMethod в С#, вы можете получить такие данные

[WebMethod]
    public static string getNames(IEnumerable<object> lst)
    {
        string names = "";
        try
        {
            foreach (object item in lst)
            {
                Type myType = item.GetType();
                IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

                foreach (PropertyInfo prop in props)
                {
                    if(prop.Name == "Values")
                    {
                        Dictionary<string, object> dic = item as Dictionary<string, object>;
                        names += dic["fstName"];
                    }
                }
            }
        }
        catch (Exception ex)
        {
             names = "-1";
        }
        return names;
    }

Пример в POST массив объектов с $.ajax для С# WebMethod