Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ajax POST未发送对象的一部分_Javascript_Ajax_Jquery_Post - Fatal编程技术网

Javascript ajax POST未发送对象的一部分

Javascript ajax POST未发送对象的一部分,javascript,ajax,jquery,post,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, succe

所以我有这个代码:

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){
    }
  });
但是,当我检查帖子来源时,似乎没有发送“答案”

以下是Firebug中的帖子来源:

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

为什么会出现这种情况?我如何让它也将对象的“答案”部分发送到AJAX post中?

如果希望有效负载包含数组,则需要将
传统
设置为true

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

默认的
POST
编码是,它由一系列扁平的
name=value
对组成

您的结构无法直接映射到一系列简单的
name=value
对,因为它很复杂。您有一个成员,它是一个对象,具有引用数组的属性

$.ajax({
    url: ajaxUrl,
    dataType: 'json',
    type: 'POST',
    data: data,
    traditional: true,
    success: function (json) {}
});
如果要发送任意复杂的结构,必须使用不同的编码,并确保服务器理解该编码。例如,您可以向服务器发送JSON或XML,但您必须通过在
ajax
方法上设置
contentType
属性(设置要向服务器发送的数据类型)来告诉它这就是您正在做的事情。然后,您的服务器必须了解如何反序列化JSON或XML

或者,确保您的结构可以映射到一系列平坦的
name=value

中途之家是以
多部分/表单数据
的形式发送数据,但您发送单个
名称=值
对,并使
部分采用不同的编码,如下所示:

$.ajax({
    url: ajaxUrl,
    dataType: 'json',
    type: 'POST',
    data: {json: JSON.stringify(data)},
    success: function(json){
    }
});
它发送一个名为json的
name=value
对,其中值是一个json编码的字符串。服务器端将以正常方式检索
json
参数的值,然后使用json反序列化程序重新创建对象图


这种中途技术有时在框架中很方便,因为框架很难使用标准请求编码以外的编码。

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

T.J.Crowder的解释很好,知识渊博。以下是我对一个实际答案的看法。我检查了我的HTTP流量并运行了您上面的AJAX请求。正如所料,
应答
未被发送。同样按照上面肾上腺素的回答,如果你在谷歌上搜索“ajax不发送空数组”,你可以从相关结果的数量上看出这也是一个问题。如果
user\u input
是一个空数组,我会改为发送
null
。我自己尝试了一下,再次如预期的那样,这次我观察到请求中发送的
answer
参数,以及
user\u 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){
    }
});

这只会使它发送
“[对象]”
作为值,几乎没有用处。这确实回答了最初的问题,因此被否决的人应该了解他的动机。+1最初的问题是为什么它没有被发送,这就是答案。这不一定能解决OP的问题,但这取决于问题中没有包括的因素。有了这些知识,他或她至少可以找到一个不同的解决方案。对否决票的解释在这里会很好。。。