如下是一个正常的HTTP请求,返回信息中的中文是乱码
HttpHeaders httpHeaders = new HttpHeaders();
HttpEntity<Object> httpEntity = new HttpEntity<>(null, httpHeaders);
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.baidu.com";
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
String body = responseEntity.getBody();
System.out.println(body);
解决方法
方法一
因为RestTemplate默认的String编码是ISO_8859_1
,怎么得知默认编码的会在后面提到。可以重新使用utf-8
解码一次
HttpHeaders httpHeaders = new HttpHeaders();
HttpEntity<Object> httpEntity = new HttpEntity<>(null, httpHeaders);
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.baidu.com";
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
String body = responseEntity.getBody();
//使用utf-8重新解码
byte[] bytes = body.getBytes(StandardCharsets.ISO_8859_1);
body = new String(bytes, StandardCharsets.UTF_8);
System.out.println(body);
方法二
更换默认的StringHttpMessageConverter
String转换器
HttpHeaders httpHeaders = new HttpHeaders();
HttpEntity<Object> httpEntity = new HttpEntity<>(null, httpHeaders);
//自定义转换器
ArrayList<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
StringHttpMessageConverter messageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
messageConverters.add(messageConverter);
//使用自定义转换器初始化RestTemplate
RestTemplate restTemplate = new RestTemplate(messageConverters);
String url = "https://www.baidu.com";
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
System.out.println(responseEntity.getStatusCode());
String body = responseEntity.getBody();
System.out.println(body);
乱码原因
查看RestTemplate
无参初始化,可以看到使用了一个无参的StringHttpMessageConverter
查看无参StringHttpMessageConverter
可以看到默认编码是
因此,解决办法就是重新编码、修改默认编码。