jQuery ajax,如何发送JSON而不是QueryString

有人可以简单地解释如何使jQuery发送实际的json而不是querystring

 $.ajax({ url : url, dataType : 'json', // I was pretty sure this would do the trick data : data, type : 'POST', complete : callback // etc }); 

这实际上将您的精心准备的json转换为querystring 。 令人讨厌的事情之一是,对象中的任何array: []都将被转换为array[]: [] ,可能是因为查询的限制。

-update-

正确的方法可以在下面的答案中find:

 $.ajax({ url : url, dataType : 'json', contentType: 'application/json; charset=UTF-8', // This is the money shot data : data, type : 'POST', complete : callback // etc }); 

请注意 ,这需要服务器端正确的CORS头,与网上的一些例子相反, Allow-Headers 不能使用通配符。 ( Allow-Origin can。)

 { Content-Type : 'application/json', Access-Control-Allow-Origin : '*', Access-Control-Allow-Headers : 'Content-Type' // You cannot use '*' } 

-update-

请注意jQuery现在将发送两个请求,一个完成握手,一个与实际的内容。 这是正常的HTTP行为称为pre-flight。 第一个请求将是一个OPTIONS标题,以确定服务器是否实际上与计划的请求兼容。

所以请记住,如果您希望您的服务器是多function的,使用QueryString只发送一个请求 。 使用真正的JSON发送至less两个请求 ,一个用于握手。

这让我头晕,所以我想让你(潜在的读者)提前知道。

您需要使用JSON.stringify先将您的对象序列化为JSON,然后指定内容types,以便您的服务器了解它的JSON。 这应该做的伎俩:

 $.ajax({ url: url, type: "POST", data: JSON.stringify(data), contentType: "application/json", complete: callback }); 

请注意, JSON对象在支持JavaScript 1.7 / ECMAScript 5或更高版本的浏览器中本地可用。 如果你需要传统的支持,你可以使用json2 。

不, dataType选项用于parsing接收到的数据。

要发布JSON,您需要通过JSON.stringify将其自身string化,并将processData选项设置为false

 $.ajax({ url: url, type: "POST", data: JSON.stringify(data), processData: false, contentType: "application/json; charset=UTF-8", complete: callback }); 

请注意,并非所有浏览器都支持JSON对象,尽pipejQuery具有.parseJSON ,但它并没有包含string。 你需要另一个polyfill库。

虽然我知道像ASP.NET MVC的许多体系结构都有内置的function来处理JSON.stringify作为contentType我的情况有点不同,所以也许这可能有助于未来的人。 我知道这会节省我几个小时!

由于我的http请求正在由不同子域上的IBM CGI API(AS400环境)处理,所以这些请求是交叉源,因此是jsonp。 我实际上通过javascript对象发送我的ajax。 这里是我的ajax POST的一个例子:

  var data = {USER : localProfile, INSTANCE : "HTHACKNEY", PAGE : $('select[name="PAGE"]').val(), TITLE : $("input[name='TITLE']").val(), HTML : html, STARTDATE : $("input[name='STARTDATE']").val(), ENDDATE : $("input[name='ENDDATE']").val(), ARCHIVE : $("input[name='ARCHIVE']").val(), ACTIVE : $("input[name='ACTIVE']").val(), URGENT : $("input[name='URGENT']").val(), AUTHLST : authStr}; //console.log(data); $.ajax({ type: "POST", url: "http://www.domian.com/webservicepgm?callback=?", data: data, dataType:'jsonp' }). done(function(data){ //handle data.WHATEVER }); 

如果你发送这回到asp.net,并需要request.form中的数据[],那么你需要将内容types设置为“application / x-www-form-urlencoded; charset = utf-8”

原帖在这里

其次是摆脱数据types,如果你不期望返回邮政将等待大约4分钟前失败。 看到这里