5

所以我有这个代码:

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

4 回答 4

3

默认POST编码是multipart/form-data,它由一系列扁平的name=value对组成。

您的结构不能直接映射到一系列平面name=value对,因为它很复杂。你有一个成员,它是一个对象,它有一个引用数组的属性。

如果要发送任意复杂的结构,则必须使用不同的编码并确保服务器能够理解该编码。例如,您可以contentType将 JSON 或 XML 发送到服务器,但您必须通过设置方法上的属性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 反序列化器重新创建对象图。

这种折衷的技术有时在难以使用标准请求编码以外的东西的框架中很方便。

于 2013-08-03T21:02:20.063 回答
1

因为您不能发布零长度数组。POST(或 HTTP 查询)键不携带任何类型信息,零长度数组将有效地构建为 POST 正文中的 null:message = [] 将序列化为 ''。

于 2013-08-03T21:03:58.813 回答
0

traditional如果您希望有效负载包含一个数组,则需要设置为 true。

$.ajax({
    url: ajaxUrl,
    dataType: 'json',
    type: 'POST',
    data: data,
    traditional: true,
    success: function (json) {}
});
于 2013-08-03T20:57:43.533 回答
0

TJ Crowder 的解释很好,知识渊博。这是我对实际答案的看法。我检查了我的 HTTP 流量并运行了您上面的 AJAX 请求。正如所料,answer没有被发送。同样与上面的肾上腺素答案一起,如果您在谷歌上搜索“ajax not sent empty array”,您可以通过相关结果的数量看到这也是一个问题。我要做的是,如果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){
    }
});
于 2013-08-03T21:32:32.883 回答