持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
前言
本篇文章介绍 SpringBoot Web 开发中的请求映射注解的详细使用,希望观众老爷们多多支持,欢迎在评论区批评指正!
设置请求映射规则通过 @RequestMapping注解,该注解标注在类或者方法上;
该注解用来设定所能匹配请求的要求。只有符合了设置的要求,请求才能被该注解标注的方法或类处理。
1. 指定请求路径
@RequestMapping注解的默认属性 value,或者属性 path都可以用来指定请求路径。
例如我们当前端发送请求时,请求路径为 /user/login,那么就可以对此请求处理的 controller层类的方法上,通过 @RequestMapping注解,指定请求路径。
@Controller
public class UserController {
@RequestMapping("/user/login")
public void login(){
}
}
通常一个 controller层的具体类,用于一个方面的全部请求的处理,如用户请求处理、管理员请求处理等。那么我们可以这样做:将@RequestMapping注解标注在类上,使这个 controller类,只处理针对用户的请求;在具体的请求方法上标注 @RequestMapping注解,指定具体路径,如登录、获取用户信息等。
@Controller
@RequestMapping('/user/')
public class UserController {
@RequestMapping("/info")
public void getUserInfo(){
}
}
注意
我们观察到 value/path属性是一个 String数组,也就是说我们可以为一个方法指定多个请求路径。
2. 指定请求方式
@RequestMapping注解的 method属性,用于指定请求的方式,有以下几种请求方式:默认方式为 GET
比如,前端发送的请求方式为 POST,那么我们就需要通过 method属性指定请求方式了。
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/login", method = RequestMethod.POST)
public void login(){
}
}
RequestMethod枚举类,是请求方式的枚举。
更快的指定请求方式
如果想要更快的指定请求方式,那么我们可以使用以下注解:
@GetMapping注解@PostMapping注解@DeleteMapping注解@PutMapping注解
例如 @PostMapping注解等价于 @RequestMapping(method = RequestMethod.POST)
注意
我们观察到 method属性是一个 RequestMethod数组,也就是说我们可以为一个方法指定多种请求方式。
3. 指定请求参数
@RequestMapping注解的 params属性(类型为 String[]),用于指定请求参数。我们可以对请求参数进行一些限制,如必须具有某些参数,或者某些参数必须为某个值,或者某个参数必须不为某个值。
比如我们期望一个 GET请求必须携带参数 code被请求方法处理:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , params = "code")
public String hello(){
return "Hello SpringBoot";
}
}
不能携带 code参数:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , params = "!code")
public String hello(){
return "Hello SpringBoot";
}
}
必须携带这个 code参数,且 code参数值必须为某个值:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , params = "code=0000")
public String hello(){
return "Hello SpringBoot";
}
}
必须携带这个 code参数,且 code参数不能为某个值:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , params = "code!=0000")
public String hello(){
return "Hello SpringBoot";
}
}
当然我们也可以指定必须携带多个请求参数,如:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/login", method = RequestMethod.POST, params = {"username", "password"})
public void login(){
}
}
4. 指定请求头
@RequestMapping注解的 headers属性(类型为 String[]),用于对请求头进行一些限制。
比如我们期望一个 GET请求,必须携带请求头 deviceType才能被请求方法处理:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , headers = "deviceType")
public String hello(){
return "Hello SpringBoot";
}
}
不能携带请求头 deviceType才能被请求方法处理:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , headers = "!deviceType")
public String hello(){
return "Hello SpringBoot";
}
}
必须携带请求头 deviceType,且请求头 deviceType必须为某个值:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , headers = "deviceType=ios")
public String hello(){
return "Hello SpringBoot";
}
}
必须携带请求头 deviceType,且请求头 deviceType不能为某个值:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , headers = "deviceType!=ios")
public String hello(){
return "Hello SpringBoot";
}
}
当然我们也可以指定必须携带多个请求头参数,如:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value = "/hello" , headers = {"deviceType","deviceSize"})
public String hello(){
return "Hello SpringBoot";
}
}
5. 对请求头 Content-Type 进行限制
@RequestMapping注解的 consumes属性(类型为 String[]),用于对请求头(Content-Type)进行一些限制。
如前端发送一个 POST请求,并且请求头的 Content-Type必须为 multipart/from-data的请求,才能被请求方法处理:
@Controller
@RequestMapping("/user/")
public class HelloController {
@PostMapping(value = "/upload", consumes = "multipart/from-data")
public void file(){
}
}
请求头的 Content-Type不能为 multipart/from-data的请求,才能被请求方法处理:
@Controller
@RequestMapping("/user/")
public class HelloController {
@PostMapping(value = "/upload", consumes = "!multipart/from-data")
public void file(){
}
}
6. 设置数据的返回类型和编码
@RequestMapping注解的 produces属性(类型为 String[]),可以对请求处理的数据返回类型和编码进行限制。
- 如指定数据返回格式为
json,编码为utf8,访问这个接口:
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value="/hi",produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String hello(){
List<String> list = new ArrayList<>();
list.add("hi");
return list;
}
}
但是一般不需要这样做,当方法标注了 @ResponseBody默认会返回 json的数据,因为 spring-boot-starter-web包含了 jackson依赖,会将 java对象自动转换为 json。
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping("/hi")
@ResponseBody
public List<String> hello(){
List<String> list = new ArrayList<>();
list.add("hi");
return list;
}
}
返回的 json数据
- 如指定数据返回格式为
xml,编码为uft8时,我们需要在pom.xml中引入jackson xml依赖,就能返回xml格式的数据了。
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
</dependency>
@Controller
@RequestMapping("/user/")
public class HelloController {
@RequestMapping(value="/hi",produces = {"application/xml;charset=UTF-8"})
@ResponseBody
public String hello(){
List<String> list = new ArrayList<>();
list.add("hi");
return list;
}
}
注意:
使用@RequestMapping注解的 produces属性必须要和 @ResponseBody注解一起使用才可以,不加@ResponseBody注解相当于返回模板文件地址(SpringBoot默认),那样就出错了
produces属性的好处:一个是浏览器查看方便(json自动格式化,带搜索),另一个可以防止中文乱码,或者你需要返回 xml格式的时候有用。