javascript
java web乱码_【SpringBoot WEB 系列】RestTemplate 之中文乱码问题 fix
【WEB 系列】RestTemplate 之中文亂碼問題 fix
在 RestTemplate 基礎用法博文中,post json 表單時,會發現存在中文亂碼問題,本文主要介紹對應的解決方案
I. 中文亂碼 Fix
1. "罪魁禍首"
場景復現
/**?*?json表單
?*/
public?void?jsonPost()?{
????RestTemplate?restTemplate?=?new?RestTemplate();
????HttpHeaders?headers?=?new?HttpHeaders();
????headers.setContentType(MediaType.APPLICATION_JSON);
????JSONObject?params?=?new?JSONObject();
????params.put("name",?"一灰灰Blog");
????params.put("age",?20);
????HttpEntity?request?=?new?HttpEntity<>(params.toJSONString(),?headers);
????String?response?=?restTemplate.postForObject("http://127.0.0.1:8080/body",?request,?String.class);
????log.info("json?post?res:?{}",?response);
}
輸出結果如下:
(json?post?res:?params:?{}?|?DemoRest.ReqBody(name=???Blog,?age=20)headers:?{"content-length":"27","host":"127.0.0.1:8080","content-type":"application/json","connection":"keep-alive","accept":"text/plain,?application/json,?application/*+json,?*/*","user-agent":"Java/1.8.0_171"}
cookies:
原因定位
RestTemplate 中存在一個HttpMessageConverter列表的屬性成員,而HttpMessageConverter主要的職責就是消息轉碼
導致我們中文亂碼的一個關鍵點在于StringHttpMessageConverter采用的默認編碼格式為StandardCharsets.ISO_8859_1
2. 指定 StringHttpMessageConverter 編碼
既然是因為StringHttpMessageConverter的默認編碼不是 UTF-8,那么將它手動改成 utf-8 不就 over 了么
/**?*?中文亂碼問題fix
?*/
public?void?chinese()?{
????RestTemplate?restTemplate?=?new?RestTemplate();
????HttpHeaders?headers?=?new?HttpHeaders();
????headers.setContentType(MediaType.APPLICATION_JSON);
????JSONObject?params?=?new?JSONObject();
????params.put("name",?"一灰灰Blog");
????params.put("age",?20);
????HttpEntity?request?=?new?HttpEntity<>(params.toJSONString(),?headers);//?中文亂碼,主要是?StringHttpMessageConverter的默認編碼為ISO導致的
????List>?list?=?restTemplate.getMessageConverters();for?(HttpMessageConverter?converter?:?list)?{if?(converter?instanceof?StringHttpMessageConverter)?{
????????????((StringHttpMessageConverter)?converter).setDefaultCharset(Charset.forName("UTF-8"));break;
????????}
????}
????String?response?=?restTemplate.postForObject("http://127.0.0.1:8080/body",?request,?String.class);
????log.info("json?post?res:?{}",?response);
}
測試輸出如:
(json post res: params:?{}?| DemoRest.ReqBody(name=一灰灰Blog, age=20)headers:?{"content-length":"33","host":"127.0.0.1:8080","content-type":"application/json","connection":"keep-alive","accept":"text/plain,?application/json,?application/*+json,?*/*","user-agent":"Java/1.8.0_171"}
cookies:
3. 傳參 POJO
在看RestTemplate的HttpMessageConvert時,會看到默認提供了一個MappingJackson2HttpMessageConverter,那么我們直接傳參 POJO,走 Jackson 序列化,是不是也可以解決中文亂碼呢?
@Data@NoArgsConstructor
@AllArgsConstructor
public?static?class?InnerParam?implements?Serializable?{
????private?static?final?long?serialVersionUID?=?-3693060057697231136L;
????private?String?name;
????private?Integer?age;
}
//?直接傳一個POJO
public?void?chinese()?{
????HttpHeaders?headers?=?new?HttpHeaders();
????headers.setContentType(MediaType.APPLICATION_JSON);
????RestTemplate?restTemplate?=?new?RestTemplate();
????InnerParam?innerParam?=?new?InnerParam("一灰灰Blog",?20);
????String?HttpEntity?entity?=?new?HttpEntity<>(innerParam,?headers);
????response?=?restTemplate.postForObject("http://127.0.0.1:8080/body",?entity,?String.class);
????log.info("json?post?DO?res:?{}",?response);
}
輸出結果如下
(json post DO res: params:?{}?| DemoRest.ReqBody(name=一灰灰Blog, age=20)headers:?{"content-length":"33","host":"127.0.0.1:8080","content-type":"application/json","connection":"keep-alive","accept":"text/plain,?application/json,?application/*+json,?*/*","user-agent":"Java/1.8.0_171"}
cookies:
說明:上面的 InnerParam 對象改成 HashMap,也是 ok 的
II. 其他
0. 項目&系列博文
博文
- 【WEB 系列】RestTemplate 之自定義請求頭
- 【WEB 系列】RestTemplate 基礎用法小結
源碼
- 工程:https://github.com/liuyueyi/spring-boot-demo
- 源碼: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/221-web-resttemplate
1. 一灰灰 Blog
盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現 bug 或者有更好的建議,歡迎批評指正,不吝感激
下面一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
- 一灰灰 Blog 個人博客 https://blog.hhui.top
- 一灰灰 Blog-Spring 專題博客 http://spring.hhui.top
總結
以上是生活随笔為你收集整理的java web乱码_【SpringBoot WEB 系列】RestTemplate 之中文乱码问题 fix的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python与tensorflow的关系
- 下一篇: asp建站系统源码_网站建设教程:虚拟主