技术派请求参数解析
大家好,我是二哥呀。今天由我来给大家讲一下《技术派是如何解析请求参数的》,这个主题乍一看,很简单,但其实不然,这个解析的过程会涉及到很多的坑点,比如说:
- POST 请求的参数为 JSON 字符串的时候,HttpServletRequest 能正确获取到参数吗?
- 如果在切面日志中通过 InputStream 中读取了参数打印,业务控制器中还能正确获得到参数吗?
- 如果请求参数为文件(图片/视频/音频)时,应该如何正确解析呢?
好,我们带着这些问题来深入地探讨一下。我会结合技术派的源码以及业务,来带大家彻底搞清楚。
比如说 ReqRecordFilter 中就对请求参数进行了解析,输出到 req-log 中。

再比如说 BodyReaderHttpServletRequestWrapper 会对请求参数的流进行封装,避免请求因为日志的打印提前消耗掉。

接下来,我们就先从 GET 请求参数解析说起,然后是 POST 请求,最后是我们动动手亲自实现一个属于我们自己的参数解析器,相信对你手写小轮子的编码功底有一个较大的提升。
发车!
GET 请求参数解析
GET 请求是 HTTP 协议中的一种请求方法,通常用于请求访问指定的资源。很多初学者搞不清楚到底是该用 GET 还是 POST,二哥的一个理解是,如果一个请求不会导致服务器上任何资源的状态变化,那你就可以使用 GET 请求。
HttpServletRequest
我们来看技术派中的一个例子,IndexController.index 方法:
@Controller
public class IndexController extends BaseViewController {
@Autowired
private IndexRecommendHelper indexRecommendHelper;
@GetMapping(path = {"/", "", "/index"})
public String index(Model model, HttpServletRequest request) {
String activeTab = request.getParameter("category");
IndexVo vo = indexRecommendHelper.buildIndexVo(activeTab);
model.addAttribute("vo", vo);
return "views/home/index";
}
}
对应的业务非常简单,点击首页中的分类,会按照分类查询对应的页面信息。

这种情况就非常适合 GET 请求,使用起来也是最简单的。
@GetMapping来定义 GET 请求的路径- HttpServletRequest.getParameter 方法用来解析 GET 请求参数。这个方法接收一个字符串参数 name,返回与之对应的请求参数的值。如果请求中没有名为 name 的参数,那么此方法返回 null。如果请求中有多个名为 name 的参数,那么此方法返回其中的第一个值。
此时,请求的 URL 是这样的:http://127.0.0.1:8080/?category=后端,实际上,后端会被编码为 http://127.0.0.1:8080/?category=%E5%90%8E%E7%AB%AF
@RequestParam
除了使用 HttpServletRequest,还可以使用 @RequestParam 注解,@RequestParam 是 Spring MVC 框架中的一个注解,用于从请求中获取参数。它将请求参数绑定到你的控制器方法的参数上。

一共四个参数,常用的就是 name(参数名)和 required(是否必须),比如说 ArticleSettingRestController 的 operate 方法。
@Permission(role = UserRole.ADMIN)
@GetMapping(path = "operate")
public ResVo operate(@RequestParam(name = "articleId") Long articleId, @RequestParam(name = "operateType") Integer operateType) {
OperateArticleEnum operate = OperateArticleEnum.fromCode(operateType);
if (operate == OperateArticleEnum.EMPTY) {
return ResVo.fail(StatusEnum.ILLEGAL_ARGUMENTS_MIXED, operateType + "非法");
}
articleSettingService.operateArticle(articleId, operate);
return ResVo.ok("ok");
}
在 pai-admin 的前端,我们对 GET 请求进行了封装,主要是通过 axios 来完成,这块我们会放在前端篇里进行讲解,这里我们先记住有这么一个事情。
export const operateArticleApi = (params: object | undefined) => {
return http.get(`${PORT1}/article/operate`, params);
};
下面给出一些复杂类型的参数,比如说枚举、Map、List 的实例,大家可以在自己本地实验一下。
public enum TYPE {
A, B, C;
}
@GetMapping(path = "enum")
public String enumParam(TYPE type) {
return type.name();
}
@GetMapping(path = "enum2")
public String enumParam2(@RequestParam TYPE type) {
return type.name();
}
@GetMapping(path = "mapper")
public String mapperParam...未能定位到原文的划线
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复