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分钟前失败。 看到这里