品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
我们用Spring MVC写接口的时候,经常要获取请求参数,前端传过来的数据形式不止一种,有拼在URL后面的查询参数,也有通过表单提交的,还有越来越普遍的JSON格式请求体,不同的传参方式在后端的接收写法也不一样。很多刚接触Spring MVC的用户容易在这里踩坑,前端数据发过来了,但是拿到的却是null,排查半天才发现是接收方式用错了。下面给大家介绍一下Spring MVC如何获取请求参数,Spring MVC如何接收Json数据的相关内容。
一、Spring MVC如何获取请求参数
Spring MVC获取请求参数的方式有多种,每种写法都有不同的使用场景,我们实际开发的时候根据前端传参的方式来选就行。常用的是@RequestParam注解来接收URL查询参数或者表单字段。比如说请求地址是/user?id=1&name=张三,我们只需要在方法参数上加@RequestParam("id")就能直接拿到对应的值。

如果参数名和方法里的变量名一致,@RequestParam甚至可以省略不写,Spring也会帮我们自动按名称匹配。
这个注解还有一个required属性,默认是true,意味着这个参数必须传,前端如果没传就会报错,改成false就变成可选参数,配合defaultValue可以给它设一个默认值,避免业务逻辑里频繁判空。

如果参数比较多,挨个写显得繁琐,我们建议直接用一个实体类来接收,把请求参数的字段名和实体类的属性名对应上,方法参数里直接声明这个类,Spring会自动把值填进去,不需要加任何注解,这种写法在表单提交场景下用得比较多,干净整洁,参数一多优势很明显。

如果要接收路径参数,可以用@PathVariable,地址写成/user/{id}这样的形式,方法参数上加@PathVariable("id"),请求进来的时候Spring会自动把路径里对应位置的值提取出来。

二、Spring MVC如何接收json数据
前端用JSON格式传数据已经是现在主流玩法了,我们会发现在前后端分离的项目里,接口请求体基本上都是JSON,Spring MVC接收JSON数据的核心注解是@RequestBody。
基本写法是在方法参数前面加上@RequestBody,然后声明一个对应的实体类,请求进来之后Spring会自动把请求体里的JSON字符串反序列化成这个实体类的对象,字段名对应上就能直接拿到值。比如前端传来的JSON是{"name":"张三","age":25},后端声明一个有name和age属性的User类,加上@RequestBody User user,拿到的对象里值就已经填好了。

需要注意的是我们项目里得有JSON解析的依赖支持,Spring Boot项目引入了spring-boot-starter-web之后,Jackson库已经默认包含在里面,不需要额外配置,直接就能用,如果有些小伙伴不是Spring Boot项目,需要手动在pom.xml里加jackson-databind的依赖,否则@RequestBody拿到的会是null或者直接报错。

还有个要注意的,我们前端发在请求的时候Content-Type必须设置成application/json,这个头信息告诉服务端请求体是JSON格式,这样Spring才会用对应的消息转换器来处理。如果Content-Type写的是application/x-www-form-urlencoded,@RequestBody就解析不了,这是很多人踩过的坑。

如果不想专门建一个实体类,也可以用Map来接收,方法参数写成@RequestBody Map
以上就是Spring MVC如何获取请求参数,Spring MVC如何接收Json数据的全部内容了。参数接收的方式有很多,URL查询参数和表单字段用@RequestParam或者实体类接收,如果是路径参数用@PathVariable,JSON请求体就用@RequestBody,使用的时候注意使用场景。我们在接收JSON的时候注意看下项目里是否有Jackson依赖,然后就是前端请求头的Content-Type必须是application/json,这两个条件缺一不可。