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博客



目录
相关文章
|
13天前
|
JSON Java 数据格式
springboot中表字段映射中设置JSON格式字段映射
springboot中表字段映射中设置JSON格式字段映射
30 1
|
11天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
33 8
|
20天前
|
Java 开发者 Spring
精通SpringBoot:16个扩展接口精讲
【10月更文挑战第16天】 SpringBoot以其简化的配置和强大的扩展性,成为了Java开发者的首选框架之一。SpringBoot提供了一系列的扩展接口,使得开发者能够灵活地定制和扩展应用的行为。掌握这些扩展接口,能够帮助我们写出更加优雅和高效的代码。本文将详细介绍16个SpringBoot的扩展接口,并探讨它们在实际开发中的应用。
37 1
|
26天前
|
存储 安全 Java
|
26天前
|
存储 算法 安全
SpringBoot 接口加密解密实现
【10月更文挑战第18天】
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
30 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
20天前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
16 0
|
20天前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
22 0
|
24天前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
44 0
|
1月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。

热门文章

最新文章