在前端的开发过程中,经常在html页面通过ajax进行前后端数据的交互,springmvc的controller进行数据的接收,但是有的时候后端会出现数据无法接收到的情况,这个是因为我们的参数和前端ajax的contenttype参数 类型不对应的情景,或者说contenttype和后台controller 方法参数到底存在什么样的关系
普通的参数我们传递的时候往往是这样的两种情况:
contenttype: "application/x-www-form-urlencoded",
contenttype: "application/json",
这样的两种方式有什么样的区别,
第一种方式:application/x-www-form-urlencoded 参数会解析为参数表,比如:
name=john+doe&age=30&city=new+york
通过ajax 传递,ajax写法如下:
let params={
"username":"张三",
"password":"123456",
}
$.ajax({
url: "dologin4",
contenttype: "application/x-www-form-urlencoded",
headers: { 'authorization': "****",'access-control-allow-origin':'*'},
type: 'post',
data: params,
success: function(result) {
console.log(result)
},
error: function(data) {
console.log('接口不通');
}
});这样的形式,后台接受的时候,使用:request.getparameter()或@requestparam,比如:
@requestmapping("/dologin")
public modelandview dologin(@requestparam string username,@requestparam string password) throws exception {
system.out.println(username);
system.out.println(password);
modelandview mav = new modelandview();
mav.addobject("info", "欢迎你");
mav.setviewname("success");
return mav;
}
@responsebody
@requestmapping("/dologin2")
public map<string,object> dologin2(httpservletrequest request,httpservletresponse response) throws exception {
string username=request.getparameter("username");
system.out.println(username);
map<string,object> map=new hashmap<>();
map.put("aa", "1111");
return map;
}适合 x-www-form-urlencoded 的情况:
- 传统html表单提交
- 简单的键值对数据
- 需要向后兼容老系统
- 文件上传(结合
multipart/form-data)
第二种方式:contenttype: "application/json", 整个body作为单一数据流处理,比如:
{
"name": "john doe",
"age": 30,
"city": "new york",
"hobbies": ["reading", "swimming"]
}通过ajax 传递,ajax写法如下:
function dologin(){
let params={
"username":"张三",
"password":"123456",
}
$.ajax({
url: "dologin4",
contenttype: "application/json",
headers: { 'authorization': "****",'access-control-allow-origin':'*'},
type: 'post',
data: json.stringify(params),
success: function(result) {
console.log(result)
},
error: function(data) {
console.log('接口不通');
}
});
}java后台接受前台传入参数的代码如下:@requestbody
@responsebody
@requestmapping("/dologin4")
public map<string,object> dologin4(httpservletrequest request,httpservletresponse response) throws exception {
string uu=request.getparameter("username");
system.out.println(uu);
stringbuilder jsonbuilder = new stringbuilder();
try (bufferedreader reader = request.getreader()) {
string line;
while ((line = reader.readline()) != null) {
jsonbuilder.append(line);
}
}
string jsonstring = jsonbuilder.tostring();
objectmapper mapper = new objectmapper();
map<string, object> jsonmap = mapper.readvalue(jsonstring, map.class);
string username = (string) jsonmap.get("username");
system.out.println(username);
map<string,object> map=new hashmap<>();
map.put("aa", "1111");
return map;
}
@responsebody
@requestmapping("/dologin3")
public map<string,object> dologin3(@requestbody map<string,object> reqmap) throws exception {
string username=reqmap.get("username").tostring();
system.out.println(username);
map<string,object> map=new hashmap<>();
map.put("aa", "1111");
return map;
}适合 application/json 的情况:
- restful api通信
- 复杂数据结构
- 需要明确数据类型
- 前后端分离架构
- 移动应用与服务器通信
两种情景是不一样的,如果你前端传入的是json格式,那么后端你用:
string uu=request.getparameter("username");
system.out.println(uu);这样是无法接收到数据的,接收到的参数一直为null,因为json是整体作为一个流传入到后台的
发表评论