使用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
相关产品推荐
相关产品推荐

