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

news2024/11/15 14:00:03

在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);
    }

}
测试结果如下:

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

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

2:映射对象类型参数

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

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);
        }
    }
}

 测试结果如下:

 

如果请求参数名称和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);
        }
    }
}

 

测试结果如下:


 

@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);
}

测试结果:

 

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());
    }
}
测试结果如下:

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());
    }
}

 

测试结果如下:

 

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);
    }
}
测试结果如下:

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

详细请看:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现调用ChatGPT详解

Java调用ChatGPT的小插件1. 申请ChatGPT账号2. 配置阶段2.1 依赖引入2.2 配置application.yml文件2.3 EnableChatGPT注解3. 使用4. 测试1. 申请ChatGPT账号 CSDN上面有很多申请ChatGPT账号的教程&#xff0c;可以直接搜索chatgpt账号注册&#xff0c;然后按照高赞的几个回答注…

谷粒商城--SPU和SKU

目录 1.SPU和SKU概念 2.表的关系理解 3.导入前端代码 4.完善后端接口 5.属性分组详情 6.规格参数详情 7. 销售属性详情 8.分组与属性关联 9.发布商品 10.仓库服务 1.SPU和SKU概念 SPU&#xff1a;standard product unit(标准化产品单元)&#xff1a;是商品信息聚合的…

链表OJ(一)

目录 从尾到头打印链表_牛客题霸_牛客网 160. 相交链表 141. 环形链表 142. 环形链表 II 138. 复制带随机指针的链表 从尾到头打印链表_牛客题霸_牛客网 输入一个链表的头节点&#xff0c;按链表从尾到头的顺序返回每个节点的值&#xff08;用数组返回&#xff09;。 如输入…

Three.js中的3D文字效果

对于一些设计网页中经常会出现一些3D的文字效果&#xff0c;本文将利用Three.js实现各种动画WebGL文本输入效果。 示例效果 原文章 文本采样 通常情况下&#xff0c;文本网格是2D的平面形状&#xff0c;我们所要实现的3D文本形状则是要在2D的平面下&#xff0c;再生成z值形成…

Oracle数据库启停命令

在日常工作中&#xff0c;关于数据库的启停&#xff1a;   先关闭上层应用服务 --> 关闭监听 --> 关闭数据库&#xff1b;   启动数据库 --> 启动监听 --> 启动应用(Oracle SQL Developer)。 监听lsnrctl Oracle监听命令。 lsnrctl start [listener-name]&a…

Xml格式化与高亮显示

具体请参考&#xff1a;Xml格式化与高亮显示

分布式系统的数据一致性方案

1、在出现一致性问题时如果系统的并发或不一致情况较少&#xff0c;可以先使用重试来解决 a、同步重试 b、异步重试 c、入库&#xff0c;定时任务重试 2、分布式事务 基于数据库 XA 协议的 2PC、3PC&#xff0c;基于业务层的TCC,基于消息队列消息表的最终一致性方案&#xff0…

七大设计原则之接口隔离原则应用

目录1 接口隔离原则介绍2 接口隔离原则应用1 接口隔离原则介绍 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;是指用多个专门的接口&#xff0c;而不使用单一的总接口&#xff0c;客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时…

八、Git远程仓库操作——跨团队成员的协作

前言 前面一篇博文介绍了git团队成员之间的协作&#xff0c;现在在介绍下如果是跨团队成员的话&#xff0c;如何协作&#xff1f; 跨团队成员协作&#xff0c;其实就是你不属于那个项目的成员&#xff0c;你没有权限向那个仓库提交代码。但是github还有另一种 pull request&a…

图形化深度学习开发平台PaddleStudio(代码开源)

目录一、PaddleStudio概述二、环境准备2.1 安装PaddlePaddle2.2 安装依赖库三、基本使用介绍3.1 启动3.2 快速体验3.2.1 下载示例项目3.2.2 训练3.2.3 评估3.2.4 测试3.2.5 静态图导出四、数据集格式4.1 图像分类4.2 目标检测4.3 语义分割4.4 实例分割五、趣味项目实战&#xf…

【前端笔试题二】从一个指定数组中,每次随机取一个数,且不能与上次取数相同,即避免相邻取数重复

前言 本篇文章记录下我在笔试过程中遇到的真实题目&#xff0c;供大家参考。 1、题目 系统给定一个数组&#xff0c;需要我们编写一个函数&#xff0c;该函数每次调用&#xff0c;随机从该数组中获取一个数&#xff0c;且不能与上一次的取数相同。 2、思路解析 数组已经有了…

Java编译过程、JIT编译详解、类加载过程

文章目录Java编译执行过程类加载过程即时编译JITJIT编译优化中的常见技术方法内联逃逸分析 栈上分配 锁消除小总结Java编译执行过程 提到编译,可能大多数人想到的就是将**.java编译成***.class文件,但其实Java代码的编译执行是一个非常复杂的过程,将**.java编译成**.class…

Lesson1:初识编程语言、Python环境搭建

一、什么是编程语言 用来和计算机交流&#xff0c;控制计算机&#xff0c;让计算机按照我们的要求做事情&#xff0c;这样的语言叫做编程语言。 Note&#xff1a;编程语言四个字可以拆成两个部分进行理解——编程语言。 所谓语言&#xff0c;它的作用就是交流&#xff0c;向对…

Redis实战—黑马点评(一) 登录篇

Redis实战 — 黑马点评&#xff08;一&#xff09; 登录篇 来自黑马的redis课程的笔记 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】 目录Redis实战 — 黑马点评&#xff08;一&#xff09; 登录篇1. 项目…

深度学习笔记:使用随机梯度下降法识别mnist数据集

深度学习算法实现流程&#xff1a; 1 从训练数据中随机选出一部分数据&#xff0c;称为mini-batch。我们的目标为减小mini-batch损失函数的值 2 计算损失函数关于权重的梯度。梯度方向即为损失函数值减小最快的方向 3 将权重沿梯度下降方向更新 4 重复以上步骤&#xff0c;在…

【自动驾驶汽车技术 | 车载雷达系统】

本文编辑&#xff1a;调皮哥的小助理 1、摘要 自动驾驶汽车传感器系统一般包括4种雷达&#xff1a;激光雷达(Lidar)、毫米波雷达(mmWave Radar)、超声波雷达(Ultrasonic Radar)和红外雷达(Infrared Radar)。目前激光雷达和毫米波雷达是基本和必要的车载传感器设备&#xff0c;…

I.MX6ULL内核开发8:linux设备驱动模型

目录 一、为什么需要设备驱动模型 二、sysfs概述 驱动模型一 驱动模型二 kobject kset kobj_type 一、为什么需要设备驱动模型 早期内核&#xff08;2.4之前&#xff09;没有统一的设备驱动模型&#xff0c;但是照样可以使用&#xff08;之前的led字符设备驱动&#xff…

2023-2-12刷题情况

字母板上的路径 题目描述 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]&#xff0c;如下所示。 我们可以按下面的指令规则行动…

合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库

基础资料 基于Air103开发板&#xff1a;&#x1f697; Air103 - LuatOS 文档 上手&#xff1a;开发上手 - LuatOS 文档 探讨重点 对官方社区库接口类redis的fbd数据库及fskv库的调用及示例进行复现及分析&#xff0c;了解两库的基本原理及操作方法。 软件及工具版本 Luat…

肝了几天的Git入门教程,收获满满

1.简介 谈及版本控制系统&#xff0c;或许大多数程序员最开始接触的都是SVN&#xff08;Subversion&#xff09;&#xff0c;它是一个集中式的版本控制系统&#xff0c;使用的时候需要提供一台的服务器来进行部署&#xff0c;所有的更新与同步操作都需要与这台服务器进行交互&…