最近在代码中遇到了一个bug,写的一个接口用swagger测试是没有问题的,但是在部署上线后,用户反馈只能接收到批量操作的第一条的数据。
接口功能很简单,用户要进行批量操作,前端把所选记录的id用;隔开,拼接为一个String,后端接收到后,使用split函数分割进行处理。
问题原因:;
分隔符会转义为%3B
,前端通过代理转发时可能将03B
又转为了;
,导致参数到后端时已经不是原来的值了
解决方案:前端在传递参数时以/path/AAA%3BCCC的格式,这样后端收到的结果就是AAA;CCC或者使用其他符号
代码复现:
- 新建SpringBoot项目,只要web和lombok依赖(非必须,用来打印日志,直接使用
System.out.println()
也行)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
- 写一个Controller和一个接口,接口参数在Path上
package com.zwj.springbootpath.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/path")
@Slf4j
public class PathController {
@GetMapping("/test/{strs}")
public void testPath(@PathVariable("strs") String strs) {
log.info("接收到的strs值为:{}",strs);
System.out.println();
}
}
- 运行项目,测试结果,或者直接在浏览器测试
curl http://127.0.0.1:8080/path/test/111;123
- 测试另一种方式
curl http://127.0.0.1:8080/path/test/111%3B123