所以我有这段代码:
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来源时,似乎没有发送'回答'..
这是Firebug中的POST源:
Parametersapplication/x-www-form-urlencoded
form_build_id form-ffe6f10e9601470ed4cfe38257a959a6
Source
form_build_id=form-ffe6f10e9601470ed4cfe38257a959a6
为什么会出现这种情况,如何才能将对象的“回答”部分发送到AJAX帖子?
答案 0 :(得分: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
的{{1}}对,其中值是JSON编码的字符串。您的服务器端将以正常方式检索json
参数的值,然后使用JSON反序列化器重新创建对象图。
这种中途技术有时在框架中很方便,因此很难使用标准请求编码以外的其他东西。
答案 1 :(得分:1)
因为您无法发布零长度数组。 POST(或HTTP查询)键不携带任何类型信息,零长度数组将在POST主体中有效地构建为null:message = []将序列化为''。
答案 2 :(得分:0)
如果您希望有效负载包含数组,则需要将traditional
设置为true。
$.ajax({
url: ajaxUrl,
dataType: 'json',
type: 'POST',
data: data,
traditional: true,
success: function (json) {}
});
答案 3 :(得分:0)
来自T.J的好解释克劳德,显然知识渊博。这是我对实际答案的看法。我检查了我的HTTP流量并运行了上面的AJAX请求。正如所料,answer
未被发送。另外上面跟着肾上腺素的回答,如果你在google上搜索“ajax不发送空数组”,你只能看到相关结果的数量,这也是一个问题。我要做的是如果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){
}
});