在接口服务开发中,我们经常用到Spring模板类RestTemplate访问restful服务。但RestTemplate处理中文乱码问题比较麻烦。以我们项目Spring版本4.1.3.RELEASE为例,RestTemplate默认构造方法初始化的StringHttpMessageConverter的默认字符集是 ISO-8859-1,所以导致RestTemplate请求的响应内容会出现中文乱码。处理方法可如下:import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
public class RestTemplateUtil {
public static RestTemplate getInstance() {
RestTemplate restTemplate = new RestTemplate();
// 设置编码
restTemplate.getMessageConverters()
.set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
// 打印日志
restTemplate.setInterceptors(
Collections.singletonList(new LoggingClientHttpRequestInterceptor()));
return restTemplate;
}
}
class LoggingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
private final static Logger LOGGER = LoggerFactory.getLogger(LoggingClientHttpRequestInterceptor.class);
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
traceRequest(request, body);
ClientHttpResponse response = execution.execute(request, body);
traceResponse(response);
return response;
}
private void traceRequest(HttpRequest request, byte[] body) throws IOException {