关于RestTemple发送微信请求遇到的坑

一、发送请求中文乱码

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 userMap = JsonMapper.nonDefaultMapper().fromJson(userInfo, Map.class);

优化后

Map resultMap = restTemplate.getForObject(getAccessTokenUrl, Map.class);
Map 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 mediaTypes = new ArrayList<>();
            mediaTypes.add(MediaType.TEXT_PLAIN);
            setSupportedMediaTypes(mediaTypes);
        }
    }
}

你可能感兴趣的:(雷默)