使用Spring Boot开发API的时候,读取请求参数是服务端编码中最基本的一项操作,Spring Boot中也提供了多种机制来满足不同的API设计要求。
@RequestParam
这是最常用的一个了吧,用来加载URL中?
之后的参数。
比如:这个请求/user?name=didispace
就可以如下面这样,使用@RequestParam
来加载URL中的name参数
@GetMapping("/param")
@ResponseBody()
public String getRequestParamValue(@RequestParam("name") String name) {
return "输入的参数为:" + name;
}
@PathVariable
这是RESTful风格API中常用的注解,用来加载URL路径中的参数
比如:这个请求/user/1
就可以如下面这样,使用@PathVariable
来加载URL中的id参数
@GetMapping("/path/{id}")
@ResponseBody()
public String getPathVariableValue(@PathVariable("id") String id) {
return "输入的参数为:" + id;
}
@MatrixVariable 矩阵变量
在使用 矩阵变量 的时候,首先要了解到 Spring Boot
默认禁用了矩阵变量的功能,这是因为默认的UrlPathHelper会移除分号;
后面的内容,导致矩阵变量无法被解析。
手动开启矩阵变量功能的方法是通过配置UrlPathHelper
,设置removeSemicolonContent
为false
,以支持矩阵变量的解析。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
// 不移除;后面的内容。矩阵变量功能就可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
这个我们用的并不是很多,了解即可,但一些国外系统有提供这类API参数,这种API的参数通过;
分割,需要注意的是,矩阵变量依赖于路径变量,因为矩阵变量是嵌入在路径变量中的。也就是说,矩阵变量的值是通过路径变量来传递的。
比如:这个请求/matrixvariable/reviews;isbn=1234;topN=5;
就可以如下面这样,使用@MatrixVariable
来加载URL中用;
分割的参数
@GetMapping("/matrixvariable/{path}")
@ResponseBody()
public String getMatrixVariableValue(@MatrixVariable String isbn, @MatrixVariable String topN, @PathVariable String path) {
return "输入的参数为:" + isbn + "," + topN + "," + path;
}
// 结果 输入的参数为:1234,5,reviews
@RequestBody
这也是最常用的一个注解,用来加载POST/PUT请求的复杂请求体(也叫:payload)。比如,客户端需要提交一个复杂数据的时候,就要将这些数据放到请求体中,然后服务端用@RequestBody
来加载请求体中的数据
@PostMapping("/body")
@ResponseBody()
public String getBodyValue(@RequestBody String param) {
return "输入的参数为:" + param;
}
@RequestHeader
@RequestHeader
注解用来加载请求头中的数据,一般在业务系统中不太使用,但在基础设施的建设中会比较常用,比如传递分布式系统的TraceID等。用法也很简单,比如,假设我们将鉴权数据存在http请求头中,那么就可以像下面这样用@RequestHeader
来加载请求头中的Authorization
参数
@GetMapping("/header")
@ResponseBody()
public String getHeaderValue(@RequestHeader("Authorization") String authToken) {
return "输入的参数为:" + authToken;
}
@CookieValue
当我们需要与客户端保持有状态的交互时,就需要用到Cookie。此时,服务端读取Cookie数据的时候,就可以像下面这样用@CookieValue
来读取Cookie中的SessionId
数据
@GetMapping("/cookie")
@ResponseBody()
public String getCookieValue(@CookieValue(name = "SessionId") String sessionId) {
return "接收到的参数为:" + sessionId;
}