日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RestTemplate--解决中文乱码

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RestTemplate--解决中文乱码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【原文鏈接】:https://blog.tecchen.xyz ,博文同步發布到博客園。
由于精力有限,對文章的更新可能不能及時同步,請點擊上面的原文鏈接訪問最新內容。
歡迎訪問我的個人網站:https://www.tecchen.xyz 。

在開發扇貝-每日一句時,使用RestTemplate請求扇貝接口,并保存返回的數據。原本正常的代碼,經過架構升級后,請求接口時,會返回亂碼數據。經過直接訪問接口等形式,最終確認是RestTemplate這個bean有問題。
對RestTemplate的聲明也比較簡單,通過對apache的httpclient進行封裝,返回bean實例。代碼如下:

@Bean RestTemplate restTemplate() {return new RestTemplate(httpRequestFactory()); }

通過斷點debug發現以String格式接收數據時,底層采用的是StringHttpMessageConverter來處理請求。查看RestTemplate的構造方法如下:

public RestTemplate() {this.messageConverters = new ArrayList();this.errorHandler = new DefaultResponseErrorHandler();this.uriTemplateHandler = new DefaultUriBuilderFactory();this.headersExtractor = new RestTemplate.HeadersExtractor();this.messageConverters.add(new ByteArrayHttpMessageConverter());this.messageConverters.add(new StringHttpMessageConverter());this.messageConverters.add(new ResourceHttpMessageConverter(false));this.messageConverters.add(new SourceHttpMessageConverter());this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());if (romePresent) {this.messageConverters.add(new AtomFeedHttpMessageConverter());this.messageConverters.add(new RssChannelHttpMessageConverter());}if (jackson2XmlPresent) {this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());} else if (jaxb2Present) {this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());}if (jackson2Present) {this.messageConverters.add(new MappingJackson2HttpMessageConverter());} else if (gsonPresent) {this.messageConverters.add(new GsonHttpMessageConverter());} else if (jsonbPresent) {this.messageConverters.add(new JsonbHttpMessageConverter());}if (jackson2SmilePresent) {this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter());}if (jackson2CborPresent) {this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());} }

其中的StringHttpMessageConverter構造方法使用了默認字符集:ISO-8859-1。

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {public static final Charset DEFAULT_CHARSET;……public StringHttpMessageConverter() {this(DEFAULT_CHARSET);}……static {DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;} }

private final List<HttpMessageConverter<?>> messageConverters
根據RestTemplate的構造方法的源碼得知所有的HttpMessageConverter都是放在final List<HttpMessageConverter<?>> messageConverters這個常量集合中。雖然集合不可修改,但是可以對其中的元素StringHttpMessageConverter進行修改。
解決方案思路都是將ISO-8859-1的StringHttpMessageConverter替換為UTF-8的StringHttpMessageConverter。

  • 示例代碼一
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  • 示例代碼二
for (HttpMessageConverter<?> httpMessageConverter : restTemplate.getMessageConverters()) {if (httpMessageConverter instanceof StringHttpMessageConverter) {((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));} }
  • 示例代碼三
// stream .findFirst(); 也是可以的 Optional<HttpMessageConverter<?>> converter = restTemplate.getMessageConverters().stream().filter(c -> c instanceof StringHttpMessageConverter).findAny(); if(converter.isPresent()) {((StringHttpMessageConverter) converter.get()).setDefaultCharset(Charset.forName("UTF-8")); }

轉載于:https://www.cnblogs.com/Candies/p/10398584.html

總結

以上是生活随笔為你收集整理的RestTemplate--解决中文乱码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。