前言
本篇文章介绍 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"})@ResponseBodypublic 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")@ResponseBodypublic 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"})@ResponseBodypublic String hello(){List<String> list = new ArrayList<>();list.add("hi");return list;}}
复制代码
注意:
使用@RequestMapping
注解的 produces
属性必须要和 @ResponseBody
注解一起使用才可以,不加@ResponseBody
注解相当于返回模板文件地址(SpringBoot
默认),那样就出错了
produces
属性的好处:一个是浏览器查看方便(json自动格式化,带搜索),另一个可以防止中文乱码,或者你需要返回 xml
格式的时候有用。