Java中REST接口GET请求URL传递多个重复参数值的实现方法
一、多值参数传参合规性说明
你采用的重复同名status参数的传参方式完全符合HTTP URL查询参数规范,属于GET请求传递同参数多值的标准实现方案:
- HTTP协议本身没有限制查询参数的命名唯一性,服务端默认会将同名的多个参数值收集为数组/集合进行解析
- 你示例中的
&是&的HTML转义写法,仅在HTML页面中嵌入URL时需要使用,直接发起HTTP请求时直接用&作为参数分隔符即可,两种写法在对应场景下都是合规的 - 除此之外也可以用逗号分隔的单参数写法
status=2,3,但重复同名参数的兼容性更好,所有主流服务端框架都原生支持解析
二、Java生态中多值GET参数的实现方案
下面是几种常用场景的实现方式:
1. Spring Boot / Spring MVC 场景
直接用参数绑定
在控制器方法中直接将对应参数声明为数组或List类型,Spring会自动完成多值封装:
@RestController public class SearchController { @GetMapping("/search") public String doSearch(@RequestParam List<Integer> status, @RequestParam String date) { // status会自动拿到所有传入的status参数值,示例中为[2,3] return "查询完成,status列表:" + status; } }
如果参数需要非必传,可配置@RequestParam(required = false),也可以设置默认值。
实体类封装接收
如果参数较多可以封装为请求实体,直接在实体中声明集合类型字段:
// 实体类 @Data public class SearchRequest { private List<Integer> status; private String date; } // 控制器绑定 @GetMapping("/search") public String doSearch(SearchRequest request) { List<Integer> statusList = request.getStatus(); // 业务逻辑处理 }
2. JAX-RS 实现(Jersey/RESTEasy等)
使用@QueryParam注解直接声明集合类型参数即可:
@Path("/search") public class SearchResource { @GET public Response doSearch(@QueryParam("status") List<Integer> status, @QueryParam("date") String date) { return Response.ok("status值列表:" + status).build(); } }
3. 原生Servlet场景
调用HttpServletRequest的getParameterValues方法获取同名参数的所有值:
protected void doGet(HttpServletRequest request, HttpServletResponse response) { String[] statusArray = request.getParameterValues("status"); String date = request.getParameter("date"); // 自行将statusArray转换为需要的类型即可 }
4. 调用外部多值参数接口(RestTemplate示例)
如果是你要调用其他提供多值参数的GET接口,用MultiValueMap封装参数即可:
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("status", 2); params.add("status", 3); params.add("date", "2021110"); String result = restTemplate.getForObject("https://localhost.com:8080/search", String.class, params);
内容的提问来源于stack exchange,提问作者Aditya Raj
相关产品推荐
相关产品推荐

