在使用ajax 的post方法时后台无法获取到name值,一直显示为null
代码如下:
$.ajax({
type : "POST",
url : "${pageContext.request.contextPath}/xx/xxxxx_xxxxx.action",
contentType:"application/json;charset=UTF-8",
dataType : "json",
data :{"id":id},
success : function(data) {
//操作
},
error:function(xhr,textStatus){
$.messager.alert('温馨提示','网络异常!');
}
});
java后台
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String queryIdentiyInfo(){
JSONObject jo = new JSONObject();
try {
System.out.println(id);
String id = getRequest().getParameter("id");
System.out.println("id值为:"+id);
//后续操作
} catch (AKSQLException e) {
jo.put("status","0");
jo.put("errorMsg", "系统内部错误");
e.printStackTrace();
}
setResult(jo);
return "success";
}
通过查找资料发现,问题在于ajax中的contentType:"application/json;charset=UTF-8"语句,将其删除后台获取正常。
为什么contentType会影响ajax传值导致后台无法获取?
根据某大佬的回答而后我的理解是
“在ajax使用post时http协议时,jquery会自动设置conent-type为application/x-www-form-urlencoded。而如若手动设置了contentType的值后Http会将传的参数的方式以id=123来传递,而并非键值对的方式(id:123)。后台获取时是以key,value来取相应的name!!!!”
如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
至此,更改后解决.
$.post,$.get 为什么又可以正常使用呢? 因为简化后的ajax并没有设置contentType的操作。
$.ajax({
type : "GET",
url : "${pageContext.request.contextPath}/bis/api/sh/state",
dataType : "json",
contentType:"application/json;charset=UTF-8",
data :{"id":id,"channel":channel,"type":type},
success : function(data) {
//操作
},
error:function(xhr,textStatus){
layer.close(load);
layer.open({
content: '网络错误.'
,btn: '确定'
});
}
});
GET方法设置
contentType后数据获取正常,POST不行
"GET" 为什么又可以呢? contentType:"application/json;charset=UTF-8"设置会将参数附加到URL的后面,而GET本身就是以这样的方式进行请求的。如以上代码则必须要设置contentType,在于它需要将data中设置的参数变成GET方式传输(参数附加URL后面).
参考源:https://bbs.csdn.net/topics/391866864?page=1