在Spring Boot开发过程中,前端与后端之间的传参是一个核心且常见的问题。本文将详细探讨前端如何向后端传递参数、后端如何接收参数、接收参数的原理,以及在实际开发中如何进行合理的配置与设置,确保参数能够正确、安全地传输和处理。
六种常见的方式
URL 查询参数
最常见的一种传输参数的方式,URL 查询参数是指附加在 URL 后面的以键值对形式传递的参数,通常用于 GET 请求中向服务器传递简单的数据。
注意:我们可以去省略这个@RequestParam 注解,使用这个注解的好处就是可以设置参数的默认值defaultValue。
路径参数
直接将参数嵌入到 URL 路径当中的一种传递方式,对于后端而言需要指定特殊的标识符和注解才能使用。
请求体参数
主要用于 POST、PUT 等请求,常传递 JSON 数据或表单数据。
注意:请求头需要设置 Content-Type: application/json,主要用于解析 JSON 数据 。
表单数据参数
表单数据指的是通过 HTML 表单或 application/x-www-form-urlencoded 方式提交的参数,主要用于 POST、PUT 请求。后端通常使用 @RequestParam 或 @ModelAttribute 来解析。
post 方式只有一个属性
注意:@RequestParam 方式(不可也可以,但是加上更清晰可读)下可直接放在 Url 后面,@RequestBody 方式下使用 json 格式传递 。
图片
post 请求传递数组
图片
图片
原理分析
图片
RequestParamMethodArgumentResolver 类
在 Spring MVC 中,@RequestParam 参数的解析由 RequestParamMethodArgumentResolver 负责。它是 HandlerMethodArgumentResolver 的实现类之一,专门用于解析 @RequestParam 注解的参数。
解析条件:首先调用supportsParameter 方法判断是否需要该类进行解析,判断逻辑参数上存在@RequestParam 注解或者未标@RequestParam注解,但是 useDefaultResolutinotallow=true 也会尝试解析。
解析逻辑:调用该类父类AbstractNamedValueMethodArgumentResolver 的resolveArgument 方法解析参数。
关键点:该类的resolveName 方法是从request.getParameter()获取参数值。
PathVariableMethodArgumentResolver 类
@PathVariable 注解的解析由 PathVariableMethodArgumentResolver 负责,它的解析逻辑与 @RequestParam 类似,但它解析的是 路径参数,而非查询参数。
解析条件:首先调用supportsParameter 方法判断是否需要该类进行解析,判断逻辑参数上存在@PathVariable 注解。
解析逻辑:与前面@RequestParam的一致。
关键点:该类的resolveName 方法是从 HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE 获取参数值。
RequestResponseBodyMethodProcessor 类
该类是用来 处理 @RequestBody 和 @ResponseBody注解的,它主要用于解析请求体(@RequestBody)和返回值(@ResponseBody),并完成 JSON/XML 的序列化和反序列化。
解析条件:首先调用supportsParameter 方法判断是否需要该类进行解析,判断逻辑是存在@RequestBody 注解。
解析逻辑:直接自身的resolveArgument 方法,通过readWithMessageConverters 方法进行请求体转换,获取参数名称,进行数据绑定和校验,适配参数。
拓展分析
如果内置的参数绑定方式无法满足特定的要求,我们可以通过自定义 HandlerMethodArgumentResolver 来实现独特的参数方式,这样可以做到更加的安全可靠,需要将自定义解析器加入链条当中。
具体的实现逻辑可以根据需求去添加,该方式适合于复杂的数据转换和自定义注解绑定逻辑,相对于统一的传参方式更加隐秘安全。