Как сделать 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 отправляет правильно отформатированный контент. Проблема в том, что серверная сторона очень и очень специфична в отношении структуры объекта, который он хочет. Если я добавлю или удалю какие-либо свойства из объекта, это приведет к сбою всего процесса, а не к свойствам, которые соответствуют. Это неудобно, потому что приятно использовать сервер-отправленное содержимое в качестве модели представления, но модели просмотра меняются.
... Все еще работаем над лучшим решением.
Ответы
Ответ 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