ajax 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
为什么会出现这种情况,如何才能将对象的“回答”部分发送到AJAXpost?
来自TJ Crowder的精彩解释,显然知识渊博。 这是我对实际答案的看法。 我检查了我的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){ } });
默认的POST
编码是multipart/form-data
,它由一系列name=value
对组成。
您的结构无法直接映射到一系列平面的name=value
对,因为它很复杂。 你有一个成员,它是一个对象,它有一个引用数组的属性。
如果要发送任意复杂的结构,则必须使用不同的编码并确保服务器了解该编码。 例如,您可以将JSON或XML发送到服务器,但您必须通过在ajax
方法上设置contentType
属性(它设置您要发送到服务器的数据类型)来告诉它您正在做的事情。 。 然后,您的服务器必须了解如何反序列化该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
name=value
对,其中值为JSON编码的字符串。 您的服务器端将以正常方式检索json
参数的值,然后使用JSON反序列化器重新创建对象图。
这种中途技术有时在框架中很方便,因此很难使用标准请求编码之外的其他东西。
因为你不能发布零长度数组。 POST(或HTTP查询)键不携带任何类型信息,零长度数组将在POST主体中有效地构建为null:message = []将序列化为”。
如果希望有效负载包含数组,则需要将traditional
设置为true。
$.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: data, traditional: true, success: function (json) {} });