You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:48:01