ajax POST不发送部分对象

时间:2013-08-03 20:52:26

标签: javascript ajax jquery 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来源时,似乎没有发送'回答'..

这是Firebug中的POST源:

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

为什么会出现这种情况,如何才能将对象的“回答”部分发送到AJAX帖子?

4 个答案:

答案 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){
    }
});