先贴上错误代码:
$.ajax({
url:'test.php',
type:'POST',
data:{
a:"aaa",
b:"bbb",
},
datatype:"json",
timeout:3000,
async: true,
cache: false,
contentType: false,
processData: false,
//headers:{"a":"123"},设置请求头
success:function(res){
res=JSON.parse(res);
console.log(res);
if(res.err_code==0){
}
else{
alert(res.msg);
}
},
error:function(xhr, textStatus, error){
if(textStatus=='timeout' || error=='timeout'){
}
},
complete:function(){
//setTimeout(function(){
// test();
//},1000);
}
});
}
这是正确代码:
$.ajax({
url:'test.php',
type:'POST',
data:{
a:"aaa",
b:"bbb",
},
datatype:"json",
timeout:3000,
async: true,
cache: false,
//headers:{"a":"123"},设置请求头
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
// processData: false,
success:function(res){
res=JSON.parse(res);
console.log(res);
if(res.err_code==0){
}
else{
alert(res.msg);
}
},
error:function(xhr, textStatus, error){
if(textStatus=='timeout' || error=='timeout'){
}
},
complete:function(){
//setTimeout(function(){
// test();
//},1000);
}
});
下面是解释,急的可以不用看了。
解决过程:
一开始以为data属性的写法写错了,但是我发现$.post()这个函数是可以的,所以不是json格式问题。
然后我就用错误的$.ajax()和$.post()打开network比较,发现
请求的Content-Type不一样
于是设置了一下contentType($.ajax这个设置是客户端告诉服务端,我要给你发送什么类型的信息(response-header里面的contentType是服务端告诉客户端,我要返回给你什么类型的信息))
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
设置之后还是不行,继续暗中观察,然后又发现
发送的数据格式不一样$.ajax发送的是对象,$.post发送的是字符串,那就是processData的问题了,这个设置是是否对发送的数据进行处理,之前知道这个设置的意思但不知道怎么它怎么处理就想反正不处理就对了,于是查了下processData的详细解释。
processData:默认为true,即发送的数据将被转换为对象。
我原来设定了false,就不处理,你的数据是什么格式就什么格式。之前一直认为是用json格式传的,然后突然想起其实不论get还是post,本质都是把数据拼到链接上发给服务端的,那不是字符串格式就当然拼接不了了。然后注释掉,可以了。
解释完毕,没有总结