关于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<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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

wus_shang

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值