RestTemplateUtil 参数编码问题,执行请求默认会对url进行再编码
RestTemplate执行请求,默认会对url字符串进行编码
·
项目对接第三方接口,接口参数编码规则为GBK,请求方式为application/x-www-form-urlencoded
String url = "http://127.0.0.1:8999/test?a=1&message=" + URLEncoder.encode("消息");
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
发现使用RestTemplate执行方法时,第三方接口无法正确解码参数。
查看源码发现会再创建URI,而URI 的默认字符编码为UTF-8,所以请求时会对url进行二次编码
@Override
@Nullable
public <T> T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables) throws RestClientException {
URI expanded = getUriTemplateHandler().expand(url, uriVariables);
return doExecute(expanded, method, requestCallback, responseExtractor);
}
解决方法url字符串传参改为URI
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("a", "1");
map.add("message", "消息");
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString("http://127.0.0.1:8999/test");
builder.queryParams(map);
builder.encode(Charset.forName("gbk"));
URI uri = builder.build().toUri();
ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, httpEntity, String.class);
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)