探索:为什么数组数据后端确要求前端传递,拼接的字符呢

ops/2024/12/24 0:19:21/

你们好,我是金金金。

在这里插入图片描述

前言

撰写本文是因为好奇,好奇为什么,拼接的字符串数据过去能直接变成数组,好奇为什么让传,拼接的字符串而不是直接传递数组数据,好奇…

探索

  • 首先看get请求,get请求参数一般都是携带在路径后面的,还有一种就是参数直接成为路径的一部分,无非就是这两种,用得较多的一般都是参数携带在路径后面的,下面也将在这种方式上演示

Get请求

  1. 前端传递,拼接的字符串,后端String数组接收

    • code

      @RestController
      @RequiredArgsConstructor
      @Slf4j
      @RequestMapping("/user/menu")
      public class CustomMenuController {@GetMapping("/add")public R<String> addCustomMenu(String[] menus) {System.out.println(Arrays.toString(menus));return R.success("添加成功");}
      }
      
    • 浏览器访问

      在这里插入图片描述

    • 控制台输出
      在这里插入图片描述

    可以看到没有任何问题,为什么传递字符串数据能直接用数组接收呢?

    • 因为 Spring MVC 对数组类型有特殊的处理逻辑。它会自动尝试将同名的查询参数或逗号分隔的字符串转换为数组
  2. 前端传递,拼接的字符串,后端List集合接收

    较多的是这种方式,因为操作集合数据比操作数组要方便的多~

    • code

      @RestController
      @RequiredArgsConstructor
      @Slf4j
      @RequestMapping("/user/menu")
      public class CustomMenuController {@GetMapping("/add")public R<String> addCustomMenu(List<String> menus) {System.out.println(menus);return R.success("添加成功");}
      }
      
    • 浏览器访问

      在这里插入图片描述

    • 控制台

      在这里插入图片描述

    很不幸,报错了:java.lang.IllegalStateException: No primary or single unique constructor found for interface java.util.List

    出错的原因:

    • SpringMVC中,当需要接收请求参数时,可以使用@RequestParam注解来指定参数的名称。
    • 对于数组类型的参数,SpringMVC会自动将请求中的参数值转换成数组并将其赋值给对应的形参,因此在数组类型的形参列表中不需要加@RequestParam注解。
    • 而对于集合类型的参数,SpringMVC无法自动将请求中的参数值转换为集合类型,需要使用@RequestParam注解来指定参数的名称,只有你加了这个注解,才会自动将请求中的数组转换为集合类型,这样才能正确的将参数赋值给对应的形参。
    • 既然已经知道了问题产生的原因,来调整一下代码:

      @RestController
      @RequiredArgsConstructor
      @Slf4j
      @RequestMapping("/user/menu")
      public class CustomMenuController {@GetMapping("/add")public R<String> addCustomMenu(@RequestParam("menus") List<String> menus) {System.out.println(menus);return R.success("添加成功");}
      }
      
    • 浏览器请求

      在这里插入图片描述

    • 控制台输出

      在这里插入图片描述

成功了,这次知道原因了吧~ 我们接着看Post类型 ~

Post请求

  1. 前端传递,拼接的字符串,后端String数组接收

    • code
    @RestController
    @RequiredArgsConstructor
    @Slf4j
    @RequestMapping("/user/menu")
    public class CustomMenuController {@PostMapping("/add")public R<String> addCustomMenu(String[] menus) {System.out.println(Arrays.toString(menus));return R.success("添加成功");}
    }
    
    • 由于是Post请求,我们用PostMan来发起测试

      在这里插入图片描述

    • 控制台输出

      在这里插入图片描述

    可以看到和Get请求差不多~ 并无啥不同的地方 请求方式不同罢了

  2. 前端传递,拼接的字符串,后端List集合接收

    • code

      @RestController
      @RequiredArgsConstructor
      @Slf4j
      @RequestMapping("/user/menu")
      public class CustomMenuController {@PostMapping("/add")public R<String> addCustomMenu(@RequestParam("menus") List<String> menus) {System.out.println(menus);return R.success("添加成功");}
      }
      
    • 由于是Post请求,我们用PostMan来发起测试

      在这里插入图片描述

    • 控制台输出

      在这里插入图片描述

      可以看到和Get请求差不多~ 并无啥不同的地方 请求方式不同罢了

  3. post请求还可以接收请求体当中的数据,这种方式下的话是不会自动转换的,需要手动去处理的,所以这种方式建议直接让前端传递数组就行

    • code

      @RestController
      @RequiredArgsConstructor
      @Slf4j
      @RequestMapping("/user/menu")
      public class CustomMenuController {@PostMapping("/add")public R<String> addCustomMenu(@RequestBody CustomMenuAddDTO customMenuAddDTO) {System.out.println(customMenuAddDTO);return R.success("添加成功");}
      }
      
      @Data
      public class CustomMenuAddDTO implements Serializable {/*** 菜单名称集合*/private List<String> menus;
      }
      
    • 由于是Post请求,我们用PostMan来发起测试

      在这里插入图片描述

    • 控制台输出

      在这里插入图片描述

    请求体方式下,如果前端传递的是menus: "1,2,3",在CustomMenuAddDTO里面定义成String[] 或者List<String> 都是不行的。均会报错!除非类型改成private String menus;那还得手动解析成数组,多麻烦,是不~

结尾

相信此时你对 后端在某些情况下让前端传递逗号拼接的字符串 有所理解了吧~

本篇文章均为个人所写,结论都是验证过的,请放心食用~ 哪里写的不对的,或者是哪里写的不好的,请大佬指出,感谢!

  • 编写有误还请大佬指正,万分感谢。

http://www.ppmy.cn/ops/144426.html

相关文章

科技查新报告需要多长时间能完成?

科技查新报告的完成时间通常取决于查新项目的复杂程度和查新机构的工作效率。具体来说&#xff0c;一般需要3到8个工作日左右&#xff0c;但也可能根据具体情况有所调整。以下是对科技查新报告完成时间的详细介绍&#xff1a; 基本工作周期 例如河南查新信息技术研究院 国内…

霍尔传感器在VR虚拟现实技术上的应用

在当今科技飞速发展的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正以前所未有的速度不断革新与拓展应用领域。 从沉浸式的游戏体验到专业的模拟训练&#xff0c;从虚拟的艺术创作空间到远程协作的工作场景&#xff0c;VR 已逐渐渗透到人们生活与工作的多个层面&…

如何使用 Python 连接 MySQL 数据库?

在Python开发中&#xff0c;连接MySQL数据库是一个常见的需求。 我们可以使用多种库来实现这一功能&#xff0c;其中最常用的是mysql-connector-python和PyMySQL。 下面我将详细介绍如何使用这两个库来连接MySQL数据库&#xff0c;并提供一些实际开发中的建议和注意事项。 1…

前端面试题整理-前端异步编程

1. 进程、线程、协程的区别 在并发编程领域&#xff0c;进程、线程和协程是三个核心概念&#xff0c;它们在资源管理、调度和执行上有着本质的不同。 首先&#xff0c;进程是操作系统进行资源分配和调度的独立单位&#xff08;资源分配基本单位&#xff09;&#xff0c;每个进…

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…

前端打印(html)

目录 1.window.print() 2.使用插件print.js 1.window.print() <template> <div id"contenteBox">内容</div> <button click"printContent">打印</button> </template> <script> export default{ data(){ retu…

图书借阅管理系统|SpringBoot|HTML|web网站|Java【源码+数据库文件+包部署成功+答疑解惑问到会为止】

代码包运行启动成功&#xff01;不管你有没有运行环境&#xff0c;哪怕你是刚买的新电脑&#xff0c;也包启动运行成功&#xff01;有不懂的地方随便问&#xff01;问到会为止&#xff01; 【功能介绍】 该系统有两种角色&#xff1a; 管理员&#xff0c;读者。 1.管理员可以添…

第十五届蓝桥杯Scratch01月stema选拔赛—排序

排序 具体要求&#xff1a; 1). 点击绿旗&#xff0c;在舞台上出现4张点数不同的扑克牌&#xff0c;牌上的点数是随机的&#xff08;4-9点&#xff09;&#xff0c;如图所示&#xff1b; 完整题目可点击下方链接查看&#xff1a; 排序_scratch_嗨信奥-玩嗨信息奥林匹克竞赛-…