restTemplate禁用url编码
这篇文章资料来自于网络,对部分知识整理,这里只是记录一下,仅供参考
一、现象
在restTemplate调用方法的时候默认对url做了编码处理
如果路径里面带了参数,url?param={"name":"张三","age":22}
这时这处理url的时候就要先对json数据进行编码处理
url?param=%7B%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%EF%BC%8C%22age%22%3A22%7D
这时使用restTemplate调用接口,会对url再次编码成
url%3Fparam%3D%257B%2522name%2522%253A%2522%25E5%25BC%25A0%25E4%25B8%2589%2522%25EF%25BC%258C%2522age%2522%253A22%257D
接口放接收到路径解码后
url?param=%7B%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%EF%BC%8C%22age%22%3A22%7D
并不是url?param={"name":"张三","age":22}
我们想要的结果并不想restTemplate调用的时候二次编码,而是使用我们的url
二、处理方式
1、禁用setEncodingMode
在代码中定义多个restTemplate
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder) {RestTemplate build = builder.build();List<HttpMessageConverter<?>> messageConverters = build.getMessageConverters();messageConverters.add(new CustomJacksonHttpMessageConverter());return build;}@Beanpublic RestTemplate restTemplateNoEncode(RestTemplateBuilder builder) {RestTemplate build = builder.build();DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory();defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);List<HttpMessageConverter<?>> messageConverters = build.getMessageConverters();messageConverters.add(new CustomJacksonHttpMessageConverter());build.setUriTemplateHandler(defaultUriBuilderFactory);return build;}
}
使用的时候使用@Qualifier指定名称就可以
@Autowired
@Qualifier("restTemplateNoEncode")
private RestTemplate restTemplate;
2、使用URL对象,避免了queryUrl被RestTemplate进行2次UrlDecode
在将queryUrl传入RestTemplate之前,将其封装为一个URL对象,避免了queryUrl被RestTemplate进行2次UrlDecode
String queryUrl = serverURL+"?query="+ URLEncoder.encode(serverQL, StandardCharsets.UTF_8.toString());
URI uriObj = URI.create(queryUrl);
String http = null;
try {http = RestTemplateUtil.get(uriObj);log.info("【监控指标】查询结果:" + http);
} catch (Exception e) {log.error("【监控指标】获取异常,请求地址:{},请求指标:{},异常信息:{}", serverURL, serverQL, e);
}
同时RestTemplate传参也是传入一个URL对象:
public static String get(URI url) {HttpHeaders headers = new HttpHeaders();headers.add("Accept", "application/json");headers.add("Content-Encoding", "UTF-8");headers.add("Content-Type", "application/json; charset=UTF-8");HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);ResponseEntity<String> response = RestTemplateUtil.getInstance().exchange(url, HttpMethod.GET, requestEntity, String.class);String responseBody = response.getBody();return responseBody;
三、参考:
restTemplate禁用url编码_resttempalte不encodeurl-CSDN博客
Java开发笔记之%被转码为%25导致url无法请求-腾讯云开发者社区-腾讯云