SpringBoot后端接口请求参数映射方式详解

简介: SpringBoot后端接口请求参数映射方式详解

在SpringBoot项目中,前端HTTP请求中的参数如何映射到Controller层的接口方法中的参数?这里针对各种方式做一个测试与总结。

1:QueryString方式

  • QueryString参数传递的方式为,在请求URL中直接拼接请求参数如:URL?param1=value1&param2=value2,

映射基本类型参数

  • 可以在Controller的接口中声明基本类型的参数,然后用@RequestParam注解修饰,指定前端传递的参数名称
@RestController
@RequestMapping("param")
@Slf4j
public class RequestParamTestController {
    @GetMapping("queryString1")
    public void testQueryString1(@RequestParam("name") String name, 
                                 @RequestParam("age") Integer age) {
        log.info("name:{}   age:{}", name, age);
    }
}

测试结果如下:

4cdec32351dc46f2bddde2e2adc7c509.png

  • 如果请求参数名称和Controller中接口方法的参数名称一致,那么可以省略@RequestParam注解。不过一般还是建议加上
  • 当请求参数名称和Controller中接口方法的参数名称一致时,加与不加@RequestParam的区别是:
  • 加上@RequestParam,其属性required默认为true,那么当前端不传递对应的参数时将会抛出异常

963890dcf090442d89769ae84013ca1a.png

  • 不加@RequestParam,前端可以不传递对应参数,此时Controller接口方法中的参数接收到的值为null

78811c233bb34ead9d9f716dbc6d1a19.png

2:映射对象类型参数

  • 定义一个对象,属性名称和前端传递的参数名称一致即可
@Data
public class User {
    private String name;
    private Integer age;
}
  • 然后将Controller接口方法中的参数声明为自定义对象:
@GetMapping("queryString2")
public void testQueryString2(@RequestBody User user) {
    log.info("name:{}   age:{}", user.getName(), user.getAge());
}

测试结果如下:

18ec09ed236f4b19a71549b404d8d601.png

3.映射数组、集合类型参数

前端有2种方式针对同一个参数传递多个值:

  在请求的QueryString中,拼接多个参数名称一样的参数即可,如URL?param=value1&param=value2&param=value3

   在请求的QueryString中,对同一个参数赋多个值,多个值之间用,隔开,如URL?param=value1,value2,value3

3.1 映射数组

在Controller接口方法中声明数组类型参数,用@RequestParam指明前端传递的参数名称即可

@GetMapping("queryString3")
public void testQueryString3(@RequestParam("name") String[] nameArray) {
    if (nameArray != null) {
        for (String name : nameArray) {
            log.info(name);
        }
    }
}

测试结果如下:

e0a56e7c2c3f46508a359d4dbe1e6953.png

804e9a52d39642e8a7f0ecdf7c7eb45c.png

如果请求参数名称和Controller中接口方法的参数名称一致,那么可以省略@RequestParam注解。不过一般还是建议加上

4:映射List

在Controller接口方法中声明List类型参数,用@RequestParam指明前端传递的参数名称即可

@RequestMapping("queryString5")

public void testQueryString5(@RequestParam("name") List<String> nameList) {
    if (nameList != null) {
        log.info("类型:{}", nameList.getClass());
        for (String name : nameList) {
            log.info(name);
        }
    }
}

测试结果如下:

795d7540c8224ad8b94f962540e60fd9.png

@RequestMapping("path1/{name}/{age}")
public void testPath1(@PathVariable("name") String name, @PathVariable("age") Integer age) {
    log.info("name:{}   age:{}", name, age);
}

5:路径参数方式 restful 风格

  • 路径传参方式是将参数直接包含在URL路径中,比如URL/paramValue1/paramValue2

路径参数方式对于请求方法GET、POST、PUT、PATCH、DELETE都适用

  • 1.映射基本类型参数

在Controller中用如下步骤接收参数:

   在接口对应的请求路径中用{参数名}形式标出路径参数

   在接口方法的参数上标注@PathVariable指名对应路径参数的参数名

@RequestMapping("path1/{name}/{age}")
public void testPath1(@PathVariable("name") String name, 
                      @PathVariable("age") Integer age) {
    log.info("name:{}   age:{}", name, age);
}

测试结果:

cbcb11b93d1d4b49a70b3c45ebe8c40e.png

5.1 映射数组、集合类型参数

直接给路径参数多个值,用,隔开即可

2.1 映射数组

在Controller接口方法中声明数组类型参数,用@PathVariable指明路径参数的名称即可

@RequestMapping("path2/{name}/{age}")
public void testPath2(@PathVariable("name") String[] nameArray, 
                      @PathVariable("age") Integer[] ageArray) {
    for (String name : nameArray) {
        log.info(name);
    }
    for (Integer age : ageArray) {
        log.info(age.toString());
    }
}

测试结果如下:

6872a4ec6f954c8bb6242a96e4c0e41f.png

2.2 映射List

@RequestMapping("path4/{name}/{age}")
public void testPath4(@PathVariable("name") List<String> nameList, 
                      @PathVariable("age") List<Integer> ageList) {
    log.info("类型:{}", nameList.getClass());
    for (String name : nameList) {
        log.info(name);
    }
    for (Integer age : ageList) {
        log.info(age.toString());
    }
}

测试结果如下:

bf3a3646ad7741fe9af1334415e74ec2.png

6:请求体json方式

参数传递方式对于请求方法POST、PUT、PATCH、DELETE都适用 但是不适合Get 请求

@RestController
@RequestMapping("param")
@Slf4j
public class RequestParamTestController {
    @PostMapping("queryString1")
    public void testQueryString1(@RequestBody("name") String name,
                                 @RequestBody("age") Integer age) {
        log.info("name:{}   age:{}", name, age);
    }
}

测试结果如下:

99dd7da3735345c897a4112ddacbd579.png

持续更新中..........

详细请看:

Required request parameter ‘name‘ for method parameter type String is not present 报错解决方法_x@lijun的博客-CSDN博客



目录
相关文章
|
1天前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
|
1天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
15 0
|
1天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
9 0
|
1天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
8 0
|
1天前
|
缓存 JSON 安全
【Uniapp 专栏】Uniapp 与后端接口对接的实战要点
【5月更文挑战第12天】在 Uniapp 项目开发中,成功对接后端接口至关重要。要点包括:深入理解后端提供的接口文档,确保数据格式(如 JSON)正确处理,选择合适的请求方式(如 GET、POST),设置正确的请求头,做好错误处理和数据缓存策略,确保安全性(如使用 HTTPS 和令牌验证)并进行全面测试。同时,进行版本管理和团队协作,与后端开发人员保持良好沟通,以实现高效、稳定的接口对接。
|
1天前
|
前端开发 小程序 测试技术
前端后端测试接口mork神器,Apifox使用一分钟入门
前端后端测试接口mork神器,Apifox使用一分钟入门
11 0
|
1天前
|
Java Spring
spring boot访问接口报500
spring boot访问接口报500
13 2
|
1天前
|
JSON JavaScript Java
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
25 0
|
1天前
|
XML JSON 前端开发
获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
|
1天前
|
Java Maven Kotlin
[AIGC] 请你写一遍博客介绍 “使用idea+kotinlin+springboot+maven 结合开发一个简单的接口“,输出markdown格式,用中文回答,请尽可能详细
[AIGC] 请你写一遍博客介绍 “使用idea+kotinlin+springboot+maven 结合开发一个简单的接口“,输出markdown格式,用中文回答,请尽可能详细