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

使用RestTemplate发送带路径变量和查询参数的GET请求出现编码错误如何解决

错误原因

核心问题是UriComponentsBuilder.toUriString()默认会对URI中的特殊字符做编码处理,直接把路径占位符的{转义为%7B、}转义为%7D,后续RestTemplate拿到已转义的字符串后无法识别占位符,两次编码逻辑冲突就会抛出"ambiguous URI path encoding"错误。

解决方案

你可以任选以下两种方案修复:

方案1:在UriComponentsBuilder阶段完成占位符替换

直接在构造URI时就传入参数完成占位符填充,生成最终编码后的URI传给RestTemplate即可,无需再通过RestTemplate传参:

// 原有UriComponentsBuilder构建逻辑不变
Uri finalUri = builder.buildAndExpand(carId, ownerId).encode().toUri();
ResponseEntity<CarDetail> carDetails = restTemplate.exchange(
        finalUri,
        HttpMethod.GET,
        requestEntity,
        CarDetail.class
);

方案2:关闭UriComponents的自动编码,保留占位符给RestTemplate处理

如果你需要保留原有RestTemplate传占位符参数的逻辑,只需要在构造URI字符串时关闭自动编码开关,保留原始{}占位符即可:

// 原有UriComponentsBuilder构建逻辑不变
String uriStr = builder.build(false).toUriString();
ResponseEntity<CarDetail> carDetails = restTemplate.exchange(
        uriStr,
        HttpMethod.GET,
        requestEntity,
        CarDetail.class,
        carId, ownerId
);

build(false)的入参表示不对URI内容做预先编码,这样占位符就会保持原始格式,RestTemplate可以正常识别并完成参数替换。

内容的提问来源于stack exchange,提问作者jimmy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:09:03