Javascript 如何使用$.ajax发送JSON而不是查询字符串?
有人能简单地解释一下如何让jQuery发送实际的JSON而不是查询字符串吗Javascript 如何使用$.ajax发送JSON而不是查询字符串?,javascript,jquery,json,query-string,Javascript,Jquery,Json,Query String,有人能简单地解释一下如何让jQuery发送实际的JSON而不是查询字符串吗 $.ajax({ url : url, dataType : 'json', // I was pretty sure this would do the trick data : data, type : 'POST', complete : callback // etc }); 这实际上会将精心准备的JSON转换为查询字符串。其中一件恼人的事情是,
$.ajax({
url : url,
dataType : 'json', // I was pretty sure this would do the trick
data : data,
type : 'POST',
complete : callback // etc
});
这实际上会将精心准备的JSON转换为查询字符串。其中一件恼人的事情是,对象中的任何数组[]
都将转换为数组[]:[]:[]
,这可能是因为查询sting的限制。您需要先使用将对象序列化为JSON,然后指定contentType
,以便服务器理解它的JSON。这应该可以做到:
$.ajax({
url: url,
type: "POST",
data: JSON.stringify(data),
contentType: "application/json",
complete: callback
});
请注意,JSON
对象在支持JavaScript 1.7/ECMAScript 5或更高版本的浏览器中本机可用。如果需要旧版支持,可以使用。否,用于解析接收的数据
要发布JSON,您需要通过将processData
选项设置为false
来对其进行字符串化
$.ajax({
url: url,
type: "POST",
data: JSON.stringify(data),
processData: false,
contentType: "application/json; charset=UTF-8",
complete: callback
});
请注意,并非所有浏览器都支持
JSON
对象,尽管jQuery有.parseJSON
,但它没有包含stringifier;您将需要另一个polyfill库。如果要将其发送回asp.net,并且需要request.form[]中的数据,则需要将内容类型设置为“application/x-www-form-urlencoded;charset=utf-8”
原职
其次,去掉数据类型,如果您不希望返回,那么POST将等待大约4分钟,然后失败。请参见虽然我知道许多架构(如ASP.NET MVC)都有内置功能来处理JSON.stringify作为contentType,但我的情况有点不同,因此这可能对将来的人有所帮助。我知道这会节省我几个小时 由于我的http请求是由IBM(AS400环境)在不同子域上的CGIAPI处理的,因此这些请求是跨源的,因此是jsonp。实际上,我通过javascript对象发送ajax。下面是我的ajax帖子的一个示例:
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
});
这将不起作用,您缺少
contentType:'application/json'
@Ohgodwhy-Oh-yeah。这有点太快了;)谢谢我以为数据类型会处理这个,但我倒过来了。关于像Bergi在另一个答案中那样在内容类型中指定字符集,您有什么想法吗?@Redsandro,这应该是不必要的。根据jQuery文档:POST数据将始终使用UTF-8字符集传输到服务器,根据W3C XMLHTTPRequest标准
@shorif2000,迟做总比不做好。。。问题是,在php中的$\u POST
中,只能看到应用程序/x-www-form-urlencoded
,如果要读取json数据,必须执行文件获取内容(“php://input“
然后可能是json\u decode()
数据类型与数据的发送方式无关。它只指定您希望调用返回的数据类型。如果要向服务器指示在data
属性中指定的数据类型,则需要将contentType
属性设置为类似于contentType:“application/json”
,感谢您的澄清。但是在这种情况下,如果服务器在响应中提供内容类型头,为什么需要在客户端指定响应类型?您不必指定它,默认情况下jQuery将尝试根据响应的MIME类型进行智能猜测。但是,通过指定它,您可以显式地告诉jQuery您希望从服务器获得什么类型的响应,jQuery将尝试将响应转换为该类型的对象。不指定它并让jQuery猜测可能会导致jQuery将响应转换为意外的格式,即使您从服务器发送了JSON。有关数据类型的更多详细信息,请查看文档:设置processData
为false
的可能重复项是不必要的,因为JSON.stringify
已返回字符串。@MarcusEkwall:Afaik它仍然是encodeURIComponent
ed,不是吗?好的,可能不需要它,但是你真的认为它会使请求失败吗?考虑到它已经是一个字符串,它不应该使请求失败。@Redsandro:是的,它在做一个“智能猜测”。但是,使用该参数的原因不仅是人们希望将其严格化,更重要的是他们没有在服务器响应中设置适当的MIME类型。感谢您为这个问题添加更多知识!已经给出了令人满意的答案,但我投了你的一票。