一、发送请求中文乱码
RestTemple默认字符编码为ISO-8859-1,而我们需要使用UTF-8。不然getForObject得到的数据中文乱码,或者postForObject发送的数据乱码。
二、数据转换Map
是因为微信接口文档虽说返回的是 Json 数据,但是同时返回的 Header 里面的 Content-Type 值确是 text/plain 的!!对于RestTemple默认可以转换的只有application/json格式的。
最终结果就是导致 RestTemplate 把数据从 HttpResponse 转换成 Map或Object 时候,找不到合适的 HttpMessageConverter 来转换!
详细剖析博客:http://blog.csdn.net/kinginblue/article/details/52706155
以上两种综合后
原代码
String userInfo = restTemplate.getForObject(getUserInfoUrl, String.class);//获取用户信息 try { userInfo = new String(userInfo.getBytes("iso-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } Map<String, Object> userMap = JsonMapper.nonDefaultMapper().fromJson(userInfo, Map.class);
优化后
Map<String,Object> resultMap = restTemplate.getForObject(getAccessTokenUrl, Map.class);
Map<String, Object> jsonObject = restTemplate.postForObject(url, jsonMenu, Map.class);
三、总结,工具类
package com.leimo.utils.wechat.util; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; /** * @author 杨小华 * @desc RestTemple工具类 * @create 2017/12/20 13:54 **/ @Configuration @Slf4j public class RestTempleConfig { /** * @desc 配置为Bean * @author 杨小华 * @create 2017/12/20 13:57 **/ @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); log.trace("指定字符编码为UTF-8,原编码为ISO-8859-1"); restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); log.trace("RestTemple默认能转换为application/json,转换追加text/plain类型"); restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter()); return restTemplate; } /** * @author 杨小华 * @desc 微信返回的contentType为text/plain,需要追加转换类型 * @create 2017/12/20 20:08 **/ private class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { private WxMappingJackson2HttpMessageConverter() { List<MediaType> mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.TEXT_PLAIN); setSupportedMediaTypes(mediaTypes); } } }