Spring Boot中WebClient如何基于Map动态构造queryParam查询参数
实现方案
Spring自带的UriBuilder的queryParam方法本身支持Object类型的入参,会自动调用参数的toString()方法转为查询参数值,不需要手动做类型转换,也不需要强制使用MultiValueMap<String,String>,直接遍历传入的queryParams逐个添加即可,完整实现如下:
import org.springframework.web.util.UriBuilder; import reactor.core.publisher.Mono; import java.util.Map; public <T> T getCommon(Map<String, Object> pathVars, Map<String, Object> queryParams, Class<T> toObject) { return getWebClient().get() .uri(uriBuilder -> { // 处理路径变量(无路径变量可传null或空Map) if (pathVars != null && !pathVars.isEmpty()) { uriBuilder.uriVariables(pathVars); } // 遍历动态添加查询参数 if (queryParams != null && !queryParams.isEmpty()) { queryParams.forEach((key, value) -> { // 可选:如果需要忽略null值,可打开下面的注释 // if (value != null) { uriBuilder.queryParam(key, value); // } }); } return uriBuilder.build(); }) .retrieve() .bodyToMono(toObject) .block(); }
使用示例
// 构造查询参数,支持String、Integer等任意类型值 Map<String, Object> queryParams = new HashMap<>(); queryParams.put("key1", "value1"); queryParams.put("key2", 20); // 调用通用方法 String result = getCommon(null, queryParams, String.class);
特殊场景说明
- 如果需要给同一个key设置多个查询参数,直接把值设为集合类型即可,示例:
queryParams.put("key", List.of("value1", 20)); // 最终生成的查询参数为 ?key=value1&key=20 - 上述代码中
block()为阻塞调用,仅适合常规Spring MVC同步场景使用,如果是WebFlux非阻塞场景,建议修改返回值为Mono<T>,去掉block()调用即可。
内容的提问来源于stack exchange,提问作者Krishnendu
相关产品推荐
相关产品推荐

