前言
本篇文章介绍 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
就不起作用了。
原文始发于微信公众号(yanghi):SpringBoot Web开发获取请求参数详解
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/226760.html