记录Spring Boot中的API请求参数读取方式

一、背景

项目开发中经常使用Spring Boot开发API,所以读取请求参数是服务端编码中最基本最常见的操作项,Spring Boot中也提供多种机制来满足不同的API设计要求。接下来就记录一下项目中用过的6种请求参数读取方式。

@RequestParam

用来加载请求URL中"?"之后的参数。比如:这个请求 /user?name=abc 就可以如下面这样,使用@RequestParam来加载URL中的name参数:

java 复制代码
@GetMapping("/user")
@ResponseBody
public User findUserByName(@RequestParam("name") String name){ 
    return userRepo.findByName(name);
}
@PathVariable

RESTful风格API中常用的注解,用来加载URL路径中的参数。比如:这个请求/user/1 就可以如下面这样,使用@PathVariable来加载URL中的id参数:

java 复制代码
@GetMapping("/user/{id}")
@ResponseBody
public User findUserById(@PathVariable("id") String id){ 
    return userRepo.findById(id);
}
@MatrixVariable

用的并不是很多,有些国外系统有提供这类API参数,这种API的参数通过;分割。

比如:请求/books/reviews;id=1234;topN=5; 就可以如下面这样,使用@MatrixVariable来加载URL中用;分割的参数:

java 复制代码
@GetMapping("/books/reviews")
@ResponseBody
public List<BookReview> getBookReviews( 
  @MatrixVariable String id,  @MatrixVariable Integer topN) {
  return bookReviewsLogic.getTopNReviewsByIsbn(isbn, topN);
}
@RequestBody

用来加载POST/PUT请求的复杂请求体(也叫:payload)。比如,客户端需要提交一个复杂数据的时候,就要将这些数据放到请求体中,然后服务端用@RequestBody来加载请求体中的数据

java 复制代码
@PostMapping("/add")
public boolean addAccounts(@RequestBody List<Account> accounts) throws SQLException {
     accounts.stream().forEach(a -> {
         a.setCreatedOn(Timestamp.from(Instant.now()));
         a.setLastLogin(Timestamp.from(Instant.now()));
     });
     return notificationLogic.addAccounts(accounts);
}
@RequestHeader

用来加载请求头中的数据,在业务系统中不太使用,但在基础设施的建设中或者鉴权请求中会比较常用,比如传递分布式系统的TraceID等。比如,假设将鉴权数据存在http请求头中,就可以用@RequestHeader来加载请求头中的Authorization参数:

java 复制代码
@GetMapping("/user")
@ResponseBody()
public List<User> getUserList(@RequestHeader("Authorization") String authToken) {
     return userRepo.findAll();
}
@CookieValue

需要与客户端保持有状态的交互时,就需要用到Cookie。此时,服务端读取Cookie数据的时候,就可以用@CookieValue来读取Cookie中的SessionId数据:

java 复制代码
@GetMapping("/user")
@ResponseBody()
public List<User> getUserList(@CookieValue(name = "SessionId") String sessionId) {
     return userRepo.findAll();
}
相关推荐
aramae3 分钟前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
SL_staff31 分钟前
别急着买商业规则引擎:90%风控场景根本不需要全量编码能力
java·程序员·groovy
ManageEngineITSM1 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
行百里er1 小时前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
IT_陈寒1 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
分支预测失败1 小时前
RISC-V 时间子系统深度专题:mtime 访问路径、SBI 定时器与 Linux tickless 协同
后端
65岁退休Coder1 小时前
PI Agent 开发一个生产级 Harness
后端·node.js·agent
SL_staff1 小时前
ERP排程总在纸上谈兵?JVS-APS如何用真实产能约束打通计划与执行闭环
java·人工智能·开源
xcl09251 小时前
24小时自助健身房系统软件开发实战指南:从架构到部署
java·spring boot
用户8356290780512 小时前
如何使用 Python 给 Word 文档添加水印
后端·python