持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
前言
本篇文章介绍 SpringBoot Web 开发中的获取请求参数各种注解的详细使用,希望观众老爷们多多支持,欢迎在评论区批评指正!
1. 获取路径参数
RestFul风格的 API接口的一些参数是在请求路径上的。类似 /user/1这里的 1就是 id。
如果我们想要获取这种格式的数据可以使用 @PathVariable注解实现。
例如:
- 要求定义
RestFul风格的接口,该接口可以用来根据id查询用户信息。请求路径要求为/user,请求方式为GET,而请求参数id要写在请求路径上,例如/user/1,这里的1就是id。那么我们可以定义以下方法,来获取路径参数:
@Controller
@RequestMapping("/user/")
public class UserController {
@GetMapping("/{id}")
@ResponseBody
public User getUserOneInfoById(@PathVariable("id") String id){
return new User();
}
}
@GetMapping("/user/{id}")``{id}表示承载查询 id。
- 如果有多个路径参数,比如说我们通过
id和username查询用户信息,请求方式为GET;比如查询用户id为1,username为zhangsan的用户,那么路径表示为/user/1/zhangsan,那么我们可以这样写:
@Controller
@RequestMapping("/user/")
public class UserController {
@GetMapping("/{id}/{username}")
@ResponseBody
public User getUserOneInfoByIdAndUsername(@PathVariable("id") String id, @PathVariable("username") String username){
return new User();
}
}
2. 获取请求体中的 json 格式参数
RestFul风格的接口中一些比较复杂的参数会转换成 json,通过请求体传递过来。这种时候我们可以使用 @RequestBody注解获取请求体中的数据。
2.1 配置
在我们使用 SSM 进行开发的时候,如果想要 SpringMVC帮我们把 json数据转换成我们需要的类型。这时候我们需要进行一些基本配置。SpringMVC默认使用 jackson来进行 json的解析,那么我们就需要导入 jackson的依赖。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
并且需要在 spring-config.xml文件中开启注解扫描驱动:
<mvc:annotation-driven></mvc:annotation-driven>
注意
我们使用 SpringBoot进行开发时,当我们引入 spring-boot-starter-web场景启动器后,该场景中就包含了 jackson依赖,不需要再额外导入。
并且SpringBoot默认开启了注解扫描驱动
2.2. 使用示例
要求定义个 RestFul风格的 API,该接口可以用来创建用户。请求路径要求为 /user,请求方式为 POST。用户数据会转换成 json通过请求体传递。
请求体数据:{"name": "zhangsan", "age": 18}
- 获取参数封装成实体对象:如果想把
json数据封装为User对象,我们可以定义这样的方法:
@Controller
@RequestMapping("/user/")
public class UserController {
@PostMapping("/")
@ResponseBody
public String addUser(@RequestBody User user){
return "insert:ok";
}
}
User实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
private int age;
private char sex;
}
- 把传递过来的参数封装成
Map集合。
@Controller
@RequestMapping("/user/")
public class UserController {
@PostMapping("/")
@ResponseBody
public String addUser(@RequestBody Map map){
return "insert:ok";
}
}
如果传递过来的数据是一个 User集合转换成的 json,那么我们可以这样写:
@Controller
@RequestMapping("/user/")
public class UserController {
@PostMapping("/")
@ResponseBody
public String addUser(@RequestBody List<User> users){
return "insert:ok";
}
}
2.3. 注意
如果需要使用 @RequestBody注解来获取请求体中 json数据并且进行转换,要求请求头 Content-Type指定内容格式为 json,即 Content-Type:application/json。
3. 获取 QueryString 格式参数
如果我们接口的参数时使用 QueryString格式的话,我们通过 SpringMVC提供的注解 @RequestParam注解来获取参数。
QueryString参数示例:/user?id=1&name=zhangsan
- 参数的单独获取。如果想要把
id、name单独获取出来,我们可以这样做:
在方法中定义方法参数,方法参数名和请求参数名一致;这个时候 QueryString参数就可以一一对应的注入到相应的方法参数上了,可以省略 @RequestParam注解。
@Controller
@RequestMapping("/user/")
public class UserController {
@PostMapping("/test")
@ResponseBody
public String addUser(String id, String name){
return "ok";
}
}
如果方法参数名和请求参数名不一致,我们就可以加上 @RequestParam 注解,将请求参数名和方法参数名进行对应。
@Controller
@RequestMapping("/user/")
public class UserController {
@PostMapping("/test")
@ResponseBody
public String addUser(@RequestParam("id") String uid, @RequestParam("name") String username){
return "ok";
}
}
- 将请求参数封装成实体对象
如果我们想把这些参数封装到一个 User对象(前提是请求参数和实体类对象属性相对应,并且提供相应的 getter setter方法)中可以使用如下写法:
@Controller
@RequestMapping("/user/")
public class UserController {
@PostMapping("/test")
@ResponseBody
public String addUser(User user){
return "ok";
}
}
当然我们也可以通过 HttpServletRequest Servlet API 获取请求参数,但是不推荐这样做,因为 SpringMVC 更方便优雅。
@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
4. 获取请求头信息和Cookie信息
3.1. 获取请求头信息
我们可以通过 @RequestHeader注解获取请求头信息,比如获取请求头Host的信息:
@Controller
public class RequestParamsController {
@RequestMapping("params")
public String toParam(
@RequestParam(value = "user_name"
) String username,
String password,
String[] hobby,
@RequestHeader("Host") String host){ //将请求头中Host的内容赋给形参host
System.out.println("username>>"+username+"\npassword>>"+password+"\nhobby>>"+ Arrays.toString(hobby));
System.out.println(host);
return "success";
}
}
当然我们也可以通过 HttpServletRequest Servlet API的 getHeader方法获取请求头信息。
3.2. 获取Cookie信息
我们可以通过 @CookieValue注解获取 Cookie信息。
@Controller
public class RequestParamsController {
@RequestMapping("params")
public String toParam(
@RequestParam(value = "user_name"
) String username,
@CookieValue("isUser") String cookieValue){ //将请求头中Host的内容赋给形参host
System.out.println(username);
System.out.println(cookieValue);
return "success";
}
}
当然我们也可以通过 HttpServletRequest Servlet API的 getCookies方法获取请求Cookie信息。
5. 相关注解的属性介绍
以上介绍的请求参数的相关注解 @PathVariable @RequestBody @RequestParam @RequestHeader @CookieValue,都有一些属性。
@RequestBody注解的属性:
@PathVariable注解的属性:
@RequestParam注解的属性:
@RequestHeader 注解的属性:
@CookieValue注解的属性:
这些注解属性的含义都是一致的,下面来一一介绍:
value,name属性就不需要介绍了,以上的章节就是介绍他们的用法。
5.1. required 属性
required 属性代表是否必须,默认值为 true,也就是说必须有对应的参数,没有就会报错,这和 @RequestMapping注解的 param属性有些类似。
例如:这里要求必须有 id这个参数,name可有可无。
@Controller
@RequestMapping("/user/")
public class HelloController {
@GetMapping("/test")
@ResponseBody
public String testUser(@RequestParam(value = "id") String uid, @RequestParam(value = "name", required = false) String name){
return "";
}
}
5.2. defaultValue 属性
defaultValue 属性,顾名思义就是设置请求参数的默认值(String)了。代表当我们没传的这个属性的时候,这个属性的默认值。
@Controller
@RequestMapping("/user/")
public class HelloController {
@GetMapping("/test")
@ResponseBody
public String testUser(@RequestParam(value = "id") String uid, @RequestParam(value = "name", required = false, defaultValue = "zhangsan") String name){
return "";
}
}
注意只有当我们指定请求参数非必须的时候(即 required = false),defaultValue才有意义;如果参数必须的话,那么肯定有值(有可能为空),defaultValue就不起作用了。