今天遇到一个问题使用RestTemplate发出http请求时,返回的结果中,中文会乱码,百度了一下,其中的一个解决办法就是把spring 的StringHttpMessageConverter 的源码改了重新编译后替换,这个方法太粗暴了,看了一下spring doc 这个StringHttpMessageConverter 的默认为ISO-8859-1但也有一个设置编码的构造方法如图
然后Spring 的RestTemplate 提供的构建器RestTemplateBuilder 提供了设置MessageConverter的方法,所以可以在构建时设置特殊的编码就可以解决问题,所以spring 是考虑到可以设置编码的,不用通过修改源码来弄
//获得请求头
MultiValueMap<String, String> headers = new HttpHeaders();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null)
{
while (headerNames.hasMoreElements())
{
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
headers.add(headerName, headerValue);
}
}
//设置字符编码集为UTF-8(其实restTemplete底层是用ISO8859-1编码,所以出现中文乱码)
MediaType mediaType = ((HttpHeaders) headers).getContentType();
if (mediaType != null)
{
Charset charset = mediaType.getCharSet();
if (charset == null)
{
mediaType = MediaType.parseMediaType(mediaType.toString() + ";charset=UTF-8");
((HttpHeaders) headers).setContentType(mediaType);
}
}