1.首先对于get请求,没什么好说的,参数是以 http://localhost:31001/test/bean?name=xuqiang&age=18 这种方式拼接在url后面的,
springmvc中可以很容易的接收这种参数,
@RequestMapping("/bean")
public User addUser(User user){
System.err.println(user);
return user;
}
@RequestMapping("/normal")
public void addUser2(String name ,Integer age){
System.err.println("接收到的name是:"+name);
System.err.println("接收到的age是:"+age);
}
无论是自己定义一个pojo,还是直接写对应名称的参数 都可以轻易的接收到参数.
2.关于post请求的不同content-type
2.1 application/x-www-form-urlencoded
这是最常见的post请求的Content-type, springmvc也可以不使用任何注解来接收这种参数
使用默认的content-type 请求. springmvc采用pojo接收.
@PostMapping("/bean")
public User addUser(User user){
System.err.println(user);
return user;
}
发现实际接收到了参数 , 简单类型也同理可以直接不使用任何注解来接收
2.2 multipart/form-data
这种content-type是在表单上传文件时候使用的,但是接收普通方式的参数同样同上一种
2.3 application/json
application/json 这个 Content-Type 现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。
这中请求方式是我们要说的重点.
我们使用postman测试application/json,请求,同样请求这个接口
@PostMapping("/bean")
public User addUser(User user){
System.err.println(user);
return user;
}
但是结果出乎意料,
发现入参的User没有接收到对应的请求参数. 这个时候我们就应该想到一个注解,@RequstBody
@PostMapping("/bean")
public User addUser(@RequestBody User user){
System.err.println(user);
return user;
}
此时数据可以成功接收,@RequestBody的作用就是当post请求是application/json 的时候,把 我们传的json映射到入参中,
如果我们不用pojo接收,想用简单类型接收json呢? 就像下面这种方式
@PostMapping("/normal")
public void addUser2(String name ,Integer age){
System.err.println("接收到的name是:"+name);
System.err.println("接收到的age是:"+age);
}
发送post请求,同样使用application/json测试.发现得到如下结果.
我们发现,当使用了application/json的type请求的时候,哪怕是简单类型,也不能直接映射到参数上去了,怎么办呢?可能这个时候会有人想到@RequestParam,我们加上测试一下
@PostMapping("/normal")
public void addUser2(@RequestParam(value = "name") String name ,@RequestParam(value = "age") Integer age){
System.err.println("接收到的name是:"+name);
System.err.println("接收到的age是:"+age);
}
同样发送请求进行测试
结果:
测试发现,@requseParam 对content-type 为application/json的方式 无能为力. 所以我们还要回到@RequestBody注解
@PostMapping("/normal")
public void addUser2(@RequestBody String name , Integer age){
System.err.println("接收到的name是:"+name);
System.err.println("接收到的age是:"+age);
}
但是当我们看到接收到的结果的时候
这是为什么? 原来是 requestBody注解把整个请求的参数当做一个字符串 赋值 给 name 了,
至今自己也很纠结,如何当请求是application/json 的时候, 接口中可以定义简单的入参而不是pojo或者是map来接收,查了很多博客也都没有讲到, 可能就是不支持吧.
其中有很多人踩过的坑,就是使用application/json 请求的时候,发现原来经常接口中随便定义名称相同的入参就可以接收参数的时候,发现一直为null无法接收,这个时候就要考虑前端发送请求的时候是不是修改了默认的content-type 变成 application/json