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

embedded/2024/12/24 23:46:51/

你们好,我是金金金。

在这里插入图片描述

前言

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

探索

  • 首先看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/embedded/148466.html

相关文章

汽车IVI中控开发入门及进阶(44):杰发科智能座舱芯片

概述: 杰发科技自成立以来,一直专注于汽车电子芯片及相关系统的研发与设计。 产品布局: 合作伙伴: 杰发科技不断提升产品设计能力和产品工艺,确保产品达 到更高的质量标准。目前杰发科技已通过ISO9001质 量管理体系与CMMIL3认证。 杰发科技长期合作的供应商(芯片代工厂、…

【蓝桥杯python研究生组备赛】001 递归+二分+前缀和

题目1 【深基2.例12】上学迟到 题目描述 学校和 yyy 的家之间的距离为 s s s 米&#xff0c;而 yyy 以 v v v 米每分钟的速度匀速走向学校。 在上学的路上&#xff0c;yyy 还要额外花费 10 10 10 分钟的时间进行垃圾分类。 学校要求必须在上午 8:00 \textrm{8:00} 8:0…

面向高精度网络的时间同步安全管理架构

论文标题&#xff1a;A Security Management Architecture for Time Synchronization Towards High Precision Networks 中文标题&#xff1a;面向高精度网络的时间同步安全管理架构 作者信息&#xff1a; 李红星&#xff0c;李登魁&#xff0c;张小东&#xff0c;寿国柱&am…

【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序

问题背景 班里有 m m m 位学生&#xff0c;共计划组织 n n n 场考试。给你一个下标从 0 0 0 开始、大小为 m n m \times n mn 的整数矩阵 s c o r e score score&#xff0c;其中每一行对应一位学生&#xff0c;而 s c o r e [ i ] [ j ] score[i][j] score[i][j] 表示…

基于Spring Boot的远程教育网站

一、系统背景与意义 随着互联网技术的飞速发展和普及&#xff0c;远程教育已成为现代教育体系中的重要组成部分。它打破了时间和空间的限制&#xff0c;让学习者可以随时随地进行学习。基于Spring Boot的远程教育网站正是为了满足这一需求而设计的&#xff0c;它利用互联网技术…

嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目

此项目是基于人脸识别的考勤系统开发&#xff0c;包括如下模块&#xff1a; 1、人脸识别考勤系统GUI界面设计&#xff0c;包括&#xff1a; &#xff08;1&#xff09;Qt环境(window环境/linux环境) &#xff1b; &#xff08;2&#xff09;Qt工程创建分析&#xff1b; &am…

Redis问题篇

问题 Q1&#xff1a;WRONGTYPE Operation against a key holding the wrong kind of value A1: redis中已经存在同名&#xff0c;但不一样类型的key值

Kibana:LINUX_X86_64 和 DEB_X86_64两种可选下载方式的区别

最近需要在vm&#xff08;操作系统是 Ubuntu 22.04.4 LTS&#xff0c;代号 Jammy。这是一个基于 x86_64 架构的 Linux 发行版&#xff09;上安装一个7.17.8版本的Kibana&#xff0c;并且不采用docker方式。 在下载的时候发现有以下两个选项&#xff0c;分别是 LINUX_X86_64 和 …