• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sandman511
V2EX  ›  程序员

restTemplate 中文乱码

  •  
  •   sandman511 · Jan 13, 2021 · 3059 views
    This topic created in 2124 days ago, the information mentioned may be changed or developed.

    stuZMq.png
    URL 是个短信接口,alarmMsgInfo 是短信的内容拼接在 URL 上
    比如拼:你好, 短信发的是:浣犲ソ
    这是说明编码用的 utf8 解析用的 gbk ?

    11 replies  •  2021-01-13 11:32:59 +08:00
    wa8n
    wa8n
    Jan 13, 2021
    1
    短信发出去乱码?仔细看下短信接口文档
    wangyanrui
    wangyanrui
    Jan 13, 2021
    2
    看一下 StringHttpMessageConverter 源码
    记得默认的编码是 IOS 8859-1
    springmarker
    springmarker
    Jan 13, 2021
    3
    get 方法发短信?
    xuwei0056
    xuwei0056
    Jan 13, 2021
    4
    先 urlEncode ?
    BrbiwsFtd9zDGZqB
    BrbiwsFtd9zDGZqB
    Jan 13, 2021
    5
    ```
    List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
    for (HttpMessageConverter<?> httpMessageConverter : list) {
    if ( httpMessageConverter instanceof StringHttpMessageConverter) {
    ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(StandardCharsets.UTF_8);
    break;
    }
    }
    ```

    替换一下 converter 试试?
    sandman511
    sandman511
    OP
    Jan 13, 2021
    6
    @xuwei0056 这个试过了 还是不行
    chendy
    chendy
    Jan 13, 2021
    7
    拼接在 url 上的中文要 urlEncode
    用 UrlEncoder.encode(msg, "GBK")
    sandman511
    sandman511
    OP
    Jan 13, 2021
    8
    @chendy
    @xuwei0056
    URLEncoder 之后 短信 发的是 %C4%E3%BA%C3
    sandman511
    sandman511
    OP
    Jan 13, 2021
    9
    @xuwei0056
    @chendy
    使用 HttpClient PostMethod 配合 URLEncoder 是可以成功发送中文的:
    HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
    HttpConnectionManagerParams params = httpConnectionManager.getParams();
    params.setConnectionTimeout(5000);
    params.setSoTimeout(20000);
    params.setDefaultMaxConnectionsPerHost(1000);
    params.setMaxTotalConnections(1000);
    client = new HttpClient( httpConnectionManager);
    PostMethod post = new PostMethod(URL + URLEncoder.encode(alarmMsgInfo, "GBK"));
    client.executeMethod(post);

    但是用 restTemplate 就不行 发的是 %C4%E3%BA%C3
    chendy
    chendy
    Jan 13, 2021❤️1
    10
    @sandman511 忘记了,直接放 url 字符串会多一次 urlEnocded,暴力方法是下面这样自己 encode url (优雅方法是自定以 UriHandler,有点麻烦……):

    RestTemplate rt = new RestTemplateBuilder().build();
    UriComponentsBuilder uri = UriComponentsBuilder.fromUriString("http://localhost:8080/test");
    uri.queryParam("x", "中文");
    uri.encode(Charset.forName("GBK"));

    System.out.println(uri.toUriString());

    Map s = rt.getForObject(uri.build().toUri(), Map.class);
    System.out.println(s);
    sandman511
    sandman511
    OP
    Jan 13, 2021
    11
    @chendy 可以了!感谢帮助!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   795 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    ♥ Do have faith in what you're doing.