千家信息网

怎么将RestTemplate的编码格式改为UTF-8

发表于:2024-10-23 作者:千家信息网编辑
千家信息网最后更新 2024年10月23日,本篇内容介绍了"怎么将RestTemplate的编码格式改为UTF-8"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读
千家信息网最后更新 2024年10月23日怎么将RestTemplate的编码格式改为UTF-8

本篇内容介绍了"怎么将RestTemplate的编码格式改为UTF-8"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

RestTemplate编码格式改为UTF-8,防止乱码

我是在调用微信的API 的时候发现微信给我返回的用户数据不能够正常显示昵称,昵称都是乱码。

 //修改RestTemplate的编码格式为UTF-8        RestTemplate restTemplate = new RestTemplate();        List> httpMessageConverters = restTemplate.getMessageConverters();        httpMessageConverters.stream().forEach(httpMessageConverter -> {            if(httpMessageConverter instanceof StringHttpMessageConverter){                StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;                messageConverter.setDefaultCharset(Charset.forName("UTF-8"));            }            //发送请求        String jsonStr = restTemplate.getForEntity(url, String.class).getBody();

上面的代码中很简单的写出来了,直接自己分装成一个方法就好。这样就解决了中文的乱码问题了

RestTemplate 中文乱码配置

restTemplate作为spring web client下的一个工具类 对http请求做了一层封装,用起来也更加简洁容易,但最近遇到一个问题就是在发送请求时由于请求中包含中文导致乱码,都变成???????一堆问号,网上很多解决方案,但很多都比较…..

先看说如何解决

@Bean配置方法:

@Bean    public RestTemplate restTemplate() {        RestTemplate restTemplate = new RestTemplate();        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));        return restTemplate;    }

applicationContext.xml配置方法:

                                                                                                                                                                                                    text/plain;charset=UTF-8                                                                                    

然后在使用的地方自动注入就好啦~~

再看看为什么会乱码

public RestTemplate() {        this.messageConverters.add(new ByteArrayHttpMessageConverter());        this.messageConverters.add(new StringHttpMessageConverter());        this.messageConverters.add(new ResourceHttpMessageConverter());        this.messageConverters.add(new SourceHttpMessageConverter());        this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());        if (romePresent) {            this.messageConverters.add(new AtomFeedHttpMessageConverter());            this.messageConverters.add(new RssChannelHttpMessageConverter());        }        if (jaxb2Present) {            this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());        }        if (jackson2Present) {            this.messageConverters.add(new MappingJackson2HttpMessageConverter());        }        else if (jacksonPresent) {            this.messageConverters.add(new MappingJacksonHttpMessageConverter());        }    }

从RestTemplate 构造方法可以看出restTemplate默认的messageConverters有好几个,这次的主角是StringHttpMessageConverter:

public class StringHttpMessageConverter extends AbstractHttpMessageConverter {    public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");    private final Charset defaultCharset;    private final List availableCharsets;    private boolean writeAcceptCharset = true;    /**     * A default constructor that uses {@code "ISO-8859-1"} as the default charset.     * @see #StringHttpMessageConverter(Charset)     */    public StringHttpMessageConverter() {        this(DEFAULT_CHARSET);    }    /**     * A constructor accepting a default charset to use if the requested content     * type does not specify one.     */    public StringHttpMessageConverter(Charset defaultCharset) {        super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);        this.defaultCharset = defaultCharset;        this.availableCharsets = new ArrayList(Charset.availableCharsets().values());    }    /**     * Indicates whether the {@code Accept-Charset} should be written to any outgoing request.     * 

Default is {@code true}. */ public void setWriteAcceptCharset(boolean writeAcceptCharset) { this.writeAcceptCharset = writeAcceptCharset; } @Override public boolean supports(Class clazz) { return String.class.equals(clazz); } @Override protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException { Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType()); return StreamUtils.copyToString(inputMessage.getBody(), charset); } @Override protected Long getContentLength(String s, MediaType contentType) { Charset charset = getContentTypeCharset(contentType); try { return (long) s.getBytes(charset.name()).length; } catch (UnsupportedEncodingException ex) { // should not occur throw new IllegalStateException(ex); } } @Override protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException { if (this.writeAcceptCharset) { outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); } Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType()); StreamUtils.copy(s, charset, outputMessage.getBody()); } /** * Return the list of supported {@link Charset}. *

By default, returns {@link Charset#availableCharsets()}. Can be overridden in subclasses. * @return the list of accepted charsets */ protected List getAcceptedCharsets() { return this.availableCharsets; } private Charset getContentTypeCharset(MediaType contentType) { if (contentType != null && contentType.getCharSet() != null) { return contentType.getCharSet(); } else { return this.defaultCharset; } }}

可以看到StringHttpMessageConverter默认是ISO-8859-1编码(有空可以看下别的MessageConverter其实都是UTF-8的)

"怎么将RestTemplate的编码格式改为UTF-8"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0