最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

將RestTemplate的編碼格式改為UTF-8,防止亂碼問題

 更新時間:2021年10月28日 11:07:47   作者:myhAini  
這篇文章主要介紹了將RestTemplate的編碼格式改為UTF-8,防止亂碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

RestTemplate編碼格式改為UTF-8,防止亂碼

我是在調(diào)用微信的API 的時候發(fā)現(xiàn)微信給我返回的用戶數(shù)據(jù)不能夠正常顯示昵稱,昵稱都是亂碼。

 //修改RestTemplate的編碼格式為UTF-8
        RestTemplate restTemplate = new RestTemplate();
        List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();
        httpMessageConverters.stream().forEach(httpMessageConverter -> {
            if(httpMessageConverter instanceof StringHttpMessageConverter){
                StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;
                messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
            }
            //發(fā)送請求
        String jsonStr = restTemplate.getForEntity(url, String.class).getBody();

上面的代碼中很簡單的寫出來了,直接自己分裝成一個方法就好。這樣就解決了中文的亂碼問題了

RestTemplate 中文亂碼配置

restTemplate作為spring web client下的一個工具類 對http請求做了一層封裝,用起來也更加簡潔容易,但最近遇到一個問題就是在發(fā)送請求時由于請求中包含中文導致亂碼,都變成???????一堆問號,網(wǎng)上很多解決方案,但很多都比較…..

先看說如何解決

@Bean配置方法:

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

applicationContext.xml配置方法:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-autowire="byName" default-lazy-init="true">
    <!--方式一、使用jdk的實現(xiàn)-->
    <bean id="ky.requestFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
        <property name="readTimeout" value="10000"/>
        <property name="connectTimeout" value="5000"/>
    </bean>
    <bean id="simpleRestTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="ky.requestFactory"/>
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/plain;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>
</beans>

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

再看看為什么會亂碼

public RestTemplate() {
        this.messageConverters.add(new ByteArrayHttpMessageConverter());
        this.messageConverters.add(new StringHttpMessageConverter());
        this.messageConverters.add(new ResourceHttpMessageConverter());
        this.messageConverters.add(new SourceHttpMessageConverter<Source>());
        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 構(gòu)造方法可以看出restTemplate默認的messageConverters有好幾個,這次的主角是StringHttpMessageConverter:

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
    public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
    private final Charset defaultCharset;
    private final List<Charset> 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>(Charset.availableCharsets().values());
    }
    /**
     * Indicates whether the {@code Accept-Charset} should be written to any outgoing request.
     * <p>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<? extends String> 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}.
     * <p>By default, returns {@link Charset#availableCharsets()}. Can be overridden in subclasses.
     * @return the list of accepted charsets
     */
    protected List<Charset> 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的),所以就把它改了就好啦~

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析

    淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析

    這篇文章主要介紹了淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 如何用Dos命令運行Java版HelloWorld你知道嗎

    如何用Dos命令運行Java版HelloWorld你知道嗎

    這篇文章主要介紹了在dos窗口中編譯和運行java文件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • java實現(xiàn)文件上傳和下載

    java實現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細介紹了java實現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • JavaSE文件操作工具類FileUtil詳解

    JavaSE文件操作工具類FileUtil詳解

    這篇文章主要為大家詳細介紹了JavaSE系列之文件操作工具類FileUtil,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java ArrayList與Vector和LinkedList的使用及源碼分析

    Java ArrayList與Vector和LinkedList的使用及源碼分析

    ArrayList、Vector、LinkedList類均在java.util包中,均為可伸縮數(shù)組,即可以動態(tài)改變長度的數(shù)組。ArrayList 和 Vector都是基于存儲元素的Object[] array來實現(xiàn)的,它們會在內(nèi)存中開辟一塊連續(xù)的內(nèi)存來存儲
    2022-11-11
  • java中線程的sleep()方法和yield()方法的區(qū)別

    java中線程的sleep()方法和yield()方法的區(qū)別

    本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時間,不釋放鎖,而yield()提示調(diào)度器當前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下
    2024-10-10
  • java實現(xiàn)俄羅斯方塊

    java實現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細介紹了java實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解JFX11+IDEA跨平臺打包發(fā)布的完美解決辦法

    詳解JFX11+IDEA跨平臺打包發(fā)布的完美解決辦法

    這篇文章主要介紹了詳解JFX11+IDEA跨平臺打包發(fā)布的完美解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • MyBatisPlus條件構(gòu)造器圖文實例詳解

    MyBatisPlus條件構(gòu)造器圖文實例詳解

    這篇文章主要介紹了MyBatisPlus條件構(gòu)造器,了解內(nèi)部原理是為了幫助我們做擴展,同時也是驗證了一個人的學習能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的
    2023-01-01
  • Java POI-TL設(shè)置Word圖片浮于文字上方

    Java POI-TL設(shè)置Word圖片浮于文字上方

    這篇文章主要為大家詳細介紹了Java如何利用POI-TL設(shè)置Word圖片環(huán)繞方式為浮于文字上方而不是嵌入的方式,感興趣的小伙伴可以參考一下
    2025-03-03

最新評論

柏乡县| 申扎县| 巧家县| 清河县| 武功县| 鞍山市| 漳平市| 潼南县| 万年县| 武鸣县| 富阳市| 锡林郭勒盟| 尚志市| 南通市| 长海县| 洪江市| 沙雅县| 含山县| 昌都县| 保定市| 南汇区| 应城市| 蓝山县| 临澧县| 遂平县| 玛纳斯县| 当阳市| 福建省| 苍南县| 鸡东县| 绵竹市| 阿坝县| 岳阳县| 南靖县| 隆回县| 望奎县| 阿巴嘎旗| 曲周县| 施秉县| 瑞安市| 永平县|