2013-08-03 2 views
5

Так что у меня этот код:Аякса POST не посылая часть объекта

var ajaxUrl = 'a/7776/as'; 
var data = { 
    'answer' : { 'user_input' : [] }, 
    'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' 
} 
$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: data, 
    success: function(json){ 
    } 
    }); 

Однако когда я проверил источник POST он появляется, что «ответ» не отправляется ..

Вот источник POST в Firebug:

Parametersapplication/x-www-form-urlencoded 
form_build_id form-ffe6f10e9601470ed4cfe38257a959a6 
Source 
form_build_id=form-ffe6f10e9601470ed4cfe38257a959a6 

Почему это так, и как я могу получить его также отправить «ответ» часть объекта в пост AJAX?

ответ

0

Хорошее объяснение от T.J. Кроудер, хорошо осведомленный. Вот мой ответ на практический ответ. Я проверил свой HTTP-трафик и выполнил ваш вышеуказанный запрос AJAX. Как и ожидалось, answer не отправлялся. Также, следуя приведенному выше решению адреналина, если вы ищете «ajax, не отправляющий пустой массив» в google, вы можете увидеть только по количеству связанных результатов, что также является проблемой. Я бы сделал, если user_input - пустой массив, вместо этого отправьте null.Я попробовал сам убедиться, и, как и ожидалось, на этот раз я заметил, что параметр answer отправляется в запросе вместе с user_input, который был отправлен как null с кодом ниже.

var userInput = []; //not sure where this is coming from in reality, but this is just an example. 

if (userInput.length == 0){ //in this example, this is obviously always true 
    userInput = null; 
} 
var ajaxUrl = 'a/7776/as'; 

var data = { 
    'answer' : { 'user_input' : userInput }, 
    'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' 
} 
$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: data, 
    success: function(json){ 
    } 
}); 
0

Вам необходимо установить значение traditional в значение true, если вы хотите, чтобы полезная информация содержала массив.

$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: data, 
    traditional: true, 
    success: function (json) {} 
}); 
+0

Это просто заставляет его посылать '' [object Object] "' ​​как значение, вряд ли полезно. –

3

по умолчанию POST кодировка является multipart/form-data, который состоит из плоской серии name=value пара.

Ваша структура не может быть отображена непосредственно в плоскую серию из name=value пар, потому что она сложная. У вас есть элемент, который является объектом, который имеет свойство, относящееся к массиву.

Если вы хотите отправить произвольно сложную структуру, вам нужно использовать другую кодировку и убедиться, что сервер понимает эту кодировку. Например, вы можете отправить JSON или XML на сервер, но вы должны сказать, что это то, что вы делаете, установив свойство contentType на метод ajax (который устанавливает тип данных, которые вы отправляете , чтобы сервер). Тогда ваш сервер должен понять, как десериализовать этот JSON или XML.

Слегка проверьте, чтобы ваша структура могла быть сопоставлена ​​с плоской серией name=value.

полпути дом, чтобы отправить данные в multipart/form-data, но где вы отправить одну name=value пару и имеют value часть быть другая кодировка, например:

$.ajax({ 
    url: ajaxUrl, 
    dataType: 'json', 
    type: 'POST', 
    data: {json: JSON.stringify(data)}, 
    success: function(json){ 
    } 
}); 

Это посылает один name=value пару с именем json, где значение представляет собой строку в кодировке JSON. Ваша серверная сторона будет восстанавливать значение параметра json обычным способом, а затем использовать десериализатор JSON для воссоздания графа объектов.

Эта техника в середине пути иногда удобна в рамках, что затрудняет использование чего-то другого, кроме стандартного кодирования запроса.

1

Потому что вы не можете отправить массив нулевой длины. Ключи POST (или HTTP-запроса) не содержат информацию о типе, а массив нулевой длины будет эффективно строить в null в теле POST: message = [] будет сериализоваться в ''.

+1

Это ответ на исходный вопрос, чтобы кто-либо из его подчиненных ожидал просветления своего мотива. – adrenalin

+0

+1 Оригинальный вопрос: почему он не отправляется, и это ответ. Теперь это не обязательно решает проблему ОП, но это зависит от факторов, которые не включены в вопрос. Имея эти знания, он или она мог найти по крайней мере другое решение. Объяснение нисходящего потока было бы замечательным здесь ... –

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