SpringBoot Web开发获取请求参数详解

前言

本篇文章介绍 SpringBoot Web 开发中的获取请求参数各种注解的详细使用,希望观众老爷们多多支持,欢迎在评论区批评指正!

1. 获取路径参数

RestFul风格的 API接口的一些参数是在请求路径上的。类似 /user/1这里的 1就是 id

如果我们想要获取这种格式的数据可以使用 @PathVariable注解实现。

例如:

  1. 要求定义 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

  1. 如果有多个路径参数,比如说我们通过 idusername查询用户信息,请求方式为 GET;比如查询用户id1usernamezhangsan的用户,那么路径表示为 /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 Web开发获取请求参数详解

并且SpringBoot默认开启了注解扫描驱动

2.2. 使用示例

要求定义个 RestFul风格的 API,该接口可以用来创建用户。请求路径要求为 /user,请求方式为 POST。用户数据会转换成 json通过请求体传递。

请求体数据:{"name": "zhangsan", "age": 18}

  1. 获取参数封装成实体对象:如果想把 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;

}
  1. 把传递过来的参数封装成 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

  1. 参数的单独获取。如果想要把 idname单独获取出来,我们可以这样做:

在方法中定义方法参数,方法参数名和请求参数名一致;这个时候 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";
}

}
  1. 将请求参数封装成实体对象

如果我们想把这些参数封装到一个 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 APIgetHeader方法获取请求头信息。

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 APIgetCookies方法获取请求Cookie信息。

5. 相关注解的属性介绍

以上介绍的请求参数的相关注解 @PathVariable @RequestBody @RequestParam @RequestHeader @CookieValue,都有一些属性。

@RequestBody注解的属性:

SpringBoot Web开发获取请求参数详解

@PathVariable注解的属性:

SpringBoot Web开发获取请求参数详解

@RequestParam注解的属性:

SpringBoot Web开发获取请求参数详解

@RequestHeader 注解的属性:

SpringBoot Web开发获取请求参数详解

@CookieValue注解的属性:

SpringBoot Web开发获取请求参数详解

这些注解属性的含义都是一致的,下面来一一介绍:

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!