当前位置: 首页 > news >正文

【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart

1. 后端传参重命名(后端参数映射)

某些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传了一个 time 给后端,而后端是使用 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值

@RequestMapping("/m4")  
public Object method4(@RequestParam("time") String createtime) {  return "收到参数:createtime="+ createtime;  
}
  • 使用浏览器发送请求并传参:
    http://127.0.0.1:8080/param/m4?time=2024-10-4 image.png|595
    可以看到,Spring 可以正确的把浏览器传递的参数 time 绑定到后端参数 createtime 上。此时,如果浏览器使用 createtime 进行参数传递呢?image.png|510
    错误日志信息为:image.png
  • 控制台打印日志显示:请求参数“time”不存在

可以得出结论:

  • 使用 @RequestParam 进行参数重命名时,请求参数只能和 @RequestParam 声明的名称一致,才能进行参数绑定和赋值
  • 使用 @RequestParam 进行参数重命名时,参数就变成了必传参数(不传参数的话就会报 400 错误)

非必传参数设置

如果我们的实际业务前端的参数是一个非必传的参数,针对上述问题,如何解决呢?

先来了解一下参数必传的原因,我们查看 @RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

@Target({ElementType.PARAMETER})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface RequestParam {  @AliasFor("name")  String value() default "";  @AliasFor("value")  String name() default "";  boolean required() default true;  String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";  
}

可以看到,required 的默认值为 true,表示含义就是:该注解修饰的参数默认为必传。既然如此,我们可以通过设置 @RequestParam 中的 require=false 来避免不传递时报错,具体实现如下:

@RequestMapping("/m5")  
public Object method5(@RequestParam(value = "time", required = false) String createtime) {  return "接收到参数 createtime: " + createtime;  
}
  • 可以看到,添加 required=false 之后,time 前面也加了 key,变成了 value=“time”
  • 注解属性时,没有指明 key 的话,默认为 value 属性
  • 如果需要对多个属性进行赋值时,需要写上 key image.png

2. 传递数组

Spring MVC 可以自动绑定数组参数的赋值。后端代码实现:

@RequestMapping("/m6")  
public String method6(String[] arrayParam) {  return Arrays.toString(arrayParam);  
}

数组参数:请求参数名与形参数组名称相同且请求参数为多个,后端定义数组类型形参即可接收参数

  • http://127.0.0.1:8080/param/m6?arrayParam=zhangsan&arrayParam=lisi&arrayParam=wangwu
  • http://127.0.0.1:8080/param/m6?arrayParam=zhangsan%2clisi%2cwangwu
  • http://127.0.0.1:8080/param/m6?arrayParam=zhangsan,lisi,wangwu
  • %2c, 的意思,第二个解码后就是第三个。他们三个的浏览器响应结果都一样 image.png

3. 传递集合

集合参数:和数组类似,同一个请求参数名有为多个,且需要使用 @RequestParam 绑定参数关系

  • 默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,就要使用 @RequestParam 绑定参数关系

请求方式和数组类似,后端代码为:

@RequestMapping("/m7")  
public String method7(@RequestParam List<String> listParam) {  return "size: " + listParam.size() + ", listParam:" + listParam;  
}
  • http://127.0.0.1:8080/param/m7?listParam=zhangsan&listParam=lisi&listParam=wangwu
  • http://127.0.0.1:8080/param/m7?listParam=zhangsan%2clisi%2cwangwu
  • http://127.0.0.1:8080/param/m7?listParam=zhangsan,lisi,wangwu image.png

4. 获取 URL 中参数 @RathVariable

path variable:路径变量。和字面意思表达的一样,这个注解主要作用是在请求 URL 路径上进行数据绑定

  • 默认传参数写在 URL 上,Spring MVC 就可以获取到

后端实现代码:

@RequestMapping("/m10/{id}/{name}")  
public Object method10(@PathVariable Integer id, @PathVariable("name") String userName){  return "解析参数id: "+id+", name: "+userName;  
}

image.png|492

  • 可以看到,后端正确获取到了 URL 中的参数,参数对应关系如下:image.png
  • 如果方法参数名称和需要绑定的 URL 中的变量名称一致时,可以简写,不用给 @PathVariable 的属性赋值,如上述例子中的 id 变量
  • 如果方法参数名称和需要绑定的 URL 中的变量名称不一致时,需要 @PathVariable 的属性 value 赋值,如上述例子中的 userName

5. 上传文件 @RequestPart

后端代码实现:

@RequestMapping("/m11")  
public Object method11(@PathVariable("file")MultipartFile file) throws IOException {  //获取文件名称  String fileName = file.getOriginalFilename();  //文件上传到指定路径  file.transferTo(new File("D:/" + file.getOriginalFilename()));  return "接收到文件名称为: "+fileName;  
}

使用 Postman 发送请求:image.png

观察目标路径,文件是否上传成功image.png|454


http://www.mrgr.cn/news/44557.html

相关文章:

  • localhost与127.0.0.1傻傻分不清楚,区别详解来了
  • HarmonyOS与Android在设计理念、系统架构、性能优化等方面全面对比
  • 插入数据库报错 ER_DUP_ENTRY
  • 中国喀斯特地貌分布shp格式数据
  • Acwing 数位统计DP
  • Linux的发展历史与环境
  • 【深度学习基础模型】图神经网络(Graph Neural Networks, GNNs)详细理解并附实现代码。
  • 股市突然暴涨,需要保持理性
  • 18732 最短路问题
  • Oracle 实时表空间使用率和最大表空间使用率区别
  • 自动驾驶系统研发系列—如何选择适合自动驾驶的激光雷达?从基础到高端全解读
  • STM32PWM应用
  • 智能医疗:Spring Boot医院管理系统开发
  • 【韩顺平Java笔记】第8章:面向对象编程(中级部分)【262-271】
  • win11下AMD CPU支持WSL2
  • 如何使用BlinkShot.io生成照片
  • 爬虫案例——爬取长沙房产网租房信息
  • 手势分割系统源码&数据集分享
  • MATLAB中lsqminnorm函数用法
  • 【AI知识点】批归一化(Batch Normalization)