2012-06-19 3 views
36

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

Данные сохраняются на сервере при отправке с использованием тестового клиента, такого как «RestEasy», и я вижу, как запрос обрабатывается в сетевой панели браузера, поэтому я считаю, что 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" 

Так что кажется, что подготовка этих библиотек для сложных почтовых данных отличается от ожидаемой.

Я вижу этот ответ, но я не хочу отправлять данные в качестве параметра запроса, поскольку я загружаю много контента. How do I send an array in an .ajax post using jQuery?

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

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

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

+0

Получаете эти данные с помощью PHP? Если да, вы можете попытаться использовать [.serialize()] (http://api.jquery.com/serialize/), но вам нужно будет добавить '[]' в конце имен переменных и получить их как массивы –

ответ

70

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

работы:

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

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

+0

Эй, просто быстрый. Я создал список параметров в виде строки в формате URL через несколько операторов '+ =', например. 'x = 123 & y = 1234 & z = 12345' ... теперь довольно долго быть честным ... очень долго. Я тоже знаю URL, так что я могу теоретически просто «данные: myParamString», или мне нужно также JSON.stringify? Спасибо, я знаю, что это старый вопрос – shanehoban

+1

@shanehoban в POST, параметры обычно отправляются в теле, а не как параметры URL. Вы делаете GET? В любом случае, я не думаю, что это очень связано. Мог бы открыть другой вопрос. – SimplGy

+0

Спасибо, я понимаю сейчас - это было время назад :) @ Просто продумано! – shanehoban

4

редактировать: Я предполагаю, что теперь начинает быть безопасно использовать родной JSON.stringify() метод, поддерживаемый most browsers (да, даже IE8 +, если вы задаетесь вопросом).

Как просто:

JSON.stringify(yourData) 

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

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

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

Это уже объект javascript, я думал, что преобразование было тривиально или автоматически обрабатывалось этими библиотеками. Какое преобразование это фактически делает между объектом js и объектом передачи JSON? Это то же самое, что и JSON.stringify? – SimplGy

11

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

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

Это лучший подход, поскольку массив в javascript сам по себе не является JSON. Даже {[]} недействительно. Массив должен быть обернут объектом и внутри свойства. –

+1

Спасибо, лучшее решение за вами. Это помогло мне отправить массив объектов с помощью ajax на мой веб-ASP.NET api. –

 Смежные вопросы

  • Нет связанных вопросов^_^