Spring Boot接口请求参数的获取方式
一、背景
使用Spring框架开发Java Web应用是一件方便、简单的事情。在控制器中定义路由、名称、请求方式的注解、获取参数的注解就能实现一个复杂的接口请求处理。对于使用获取参数的时候是否会疑问该如何使用?使用那种方式好?复杂的传参如何获取?为什么使用了注解没有效果?带着这些问题,通过本篇文章对获取参数的方式进行讲解,并配上具体实践的案例说明,对后续使用过程中不会在盲目使用。
Spring框架的接口请求获取参数是通过标记各种注解的方式来实现参数的获取绑定的,具体涉及框架的参数绑定原理。主要通过下述6种方式来满足各个场景需求,所以对这6个方式一一的描述、代码、效果来说明。
二、类型
@RequestParam
RequestParam用于将指定的请求参数赋值给方法中的形参,用来加载URL中?
之后的参数。比如test/get?name1=test&age=18,使用@RequestParam
来加载URL中的name与age参数。
属性 | 类型 | 是否必要 | 说明 |
name | String | 否 | 指定请求参数绑定的名称 |
value | String | 否 | name属性的别名 |
required | bool | 否 | 指示参数是否必须绑定 |
defaultVale | String | 否 | 如果没有传入参数而使用的默认值 |
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam { /** * Alias for {@link #name}. */ @AliasFor("name") String value() default ""; /** * The name of the request parameter to bind to. * @since 4.2 */ @AliasFor("value") String name() default ""; /** * Whether the parameter is required. * <p>Defaults to {@code true}, leading to an exception being thrown * if the parameter is missing in the request. Switch this to * {@code false} if you prefer a {@code null} value if the parameter is * not present in the request. * <p>Alternatively, provide a {@link #defaultValue}, which implicitly * sets this flag to {@code false}. */ boolean required() default true; /** * The default value to use as a fallback when the request parameter is * not provided or has an empty value. * <p>Supplying a default value implicitly sets {@link #required} to * {@code false}. */ String defaultValue() default ValueConstants.DEFAULT_NONE; }
上述表格描述注解需要的参数、及其说明。下面代码则是参数具体的说明,其他注解的参数基本保持一致。
/** * @RequestParam("name") * @param name * @param age * @return */ @GetMapping("/get") public String get(@RequestParam(name = "name",value = "name",required = true)String name,String age) { return "test"; }
使用@RequestParam注解获取name与age参数。①当参数的required为true,传入的参数无返回404错误。②使用该注解,如果接口传入参数无该参数值则返回404,因为注解的required的默认值是true,所以无必须则使用false状态。③如果接口参数没有使用@RequestParam注解,会默认按照参数名称对应绑定参数值。④如果存在默认值则使用defaultVale,在传入参数为null时候使用默认值代替,并且提高接口的可靠性和完整性。⑤接口类型@PostMapping("/get")或者@GetMapping("/get")都是支持的。
@PathVariable
PathVariable用于将请求URL中的模板变量部分映射到功能处理方法的参数上。用来加载URL路径中的参数,其中URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。比如:test/getPathVariable/12/test就可以如下面这样,使用@PathVariable
来加载URL中的id与name参数。
/** * * @param id * @return */ @GetMapping("/getPathVariable/{id}/{name}") public String getPathVariable(@PathVariable("id") String id,@PathVariable("name") String name){ return "PathVariable"; }
在路由中定义id、name,然后绑定id、name获取传入的参数。路由的参数说明、方法参数的绑定、请求的传入参数数要保持一致性,否则在注解机制绑定参数过程中提示404或者500的错误信息。
@MatrixVariable
@MatrixVariable
来加载URL中的id与name参数。@GetMapping("/getMatrixVariable/{age}")
public String getMatrixVariable(@PathVariable("age") Integer age,@MatrixVariable("id") String id,@MatrixVariable("name") String name){
return "MatrixVariable";
}
@RequestBody
RequestBody是比较常用的注解,用于加载POST/PUT请求的复杂请求体(也叫:payload),支持复杂的数据结构,使得客户端可以发送结构化的数据(如对象或数组),将这些数据放到请求体中,然后服务端用@RequestBody
来加载请求体中的数据。比如test/potsRequestBody,然后在请求体Body中上传对象JSON数据。
@PostMapping("/potsRequestBody") public String potsRequestBody(@RequestBody RequestDto requestDto){ return "RequestBody"; }
在使用@RequestBody中上传复杂的结构体(数组、对象、嵌套对象)等,约定名称匹配绑定数值。一般使用与数据的新增、编辑操作。注意在请求体(Body)中选择上传方式的区别(none、form-data、x-www-form_data、row的json、xml、html、JavaScript、plain)。
@RequestHeader
@GetMapping("/getRequestHeader") public String getRequestHeader(@RequestHeader("Authorization") String authToken){ return "RequestHeader"; }
在使用@RequestHeader中,对请求头新增Authorization内容,参数authToken获取传入的请求头信息。
@CookieValue
CookieValue用于服务端读取Cookie数据的时候,就可以像下面这样用@CookieValue获取客户端的Cookie信息。比如:test/getCookieValue
@GetMapping("/getCookieValue") public String getCookieValue(@CookieValue(name="SessionId") String SessionId){ return "CookiesValue"; }
在使用@CookieValue中,对请求的Cookie中新增SessionId内容,参数SessionId获取传入的Cookies信息。
三、总结
上述介绍6中方式获取接口请求传入参数,使用注解的方式绑定获取值。本质是SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了。每一种注解方式都代表使用的场景、依据项目中实际要求进行选择,或者使用已经总结业务场景案例来使用。这6种方式在实际使用中可以混合使用,获取传入参数值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)