简体   繁体   English

Java Spring resttemplate 字符编码

[英]Java Spring resttemplate character encoding

I'm using the Java Spring Resttemplate for getting a json via a get request.我正在使用 Java Spring Resttemplate 通过获取请求获取 json。 The JSON I'm getting has instead of special character slike ü ö ä or ß some weird stuff.我得到的 JSON 有一些奇怪的东西,而不是像 ü ö ä 或 ß 这样的特殊字符。 So I guess somethings wrong with the character encoding.所以我猜字符编码有问题。 I can't find any help on the internet.我在互联网上找不到任何帮助。 The code I'm using for now is:我现在使用的代码是:

String json = restTemplate.getForObject(
    overPassStatementPostCode,
    String.class,
    params);

You just need to add the StringHttpMessageConverter to the template's message converters:您只需要将StringHttpMessageConverter添加到模板的消息转换器中:

RestTemplate template = new RestTemplate();
template.getMessageConverters()
        .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
ResponseEntity<Object> response = template.exchange(endpoint, method, entity, 
                                                    Object.class);

First I tried @beerbajay 's way , but it not helps。 Finally I resolve it by below way首先我尝试了@beerbajay的方式,但它没有帮助。最后我通过以下方式解决它

        RestTemplate template = new RestTemplate();
//      template.getMessageConverters()
//              .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(newArrayList(MediaType.APPLICATION_JSON));
        ResponseEntity<String> response = template.exchange(url, HttpMethod.GET, new HttpEntity<String>(headers), String.class);

I've same issue on this case, after one search, I've got this link: https://gist.github.com/knight1128/66f3e4817ab35c7397fd我在这种情况下也有同样的问题,经过一次搜索,我得到了这个链接: https ://gist.github.com/knight1128/66f3e4817ab35c7397fd

its workaround is working for me:它的解决方法对我有用:

package com.google.locationlab;

import com.google.common.collect.Lists;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.springframework.http.*;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;
import java.nio.charset.Charset;
import java.util.List;

public class PortalRestTemplateIntegrationTest {
    private Log logger = LogFactory.getLog(PortalRestTemplateIntegrationTest.class);

    @Test
    public void test() throws Exception {
        RestTemplate restTemplate = new RestTemplate();

        HttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        List<HttpMessageConverter<?>> httpMessageConverter = Lists.newArrayList();
        httpMessageConverter.add(stringHttpMessageConverter);
        restTemplate.setMessageConverters(httpMessageConverter);

        URI targetUrl= UriComponentsBuilder.fromUriString("http://portal.net")
                .path("search")
                .queryParam("q", "잠실역")
                .build()
                .toUri();

        HttpHeaders headers = new HttpHeaders();
        Charset utf8 = Charset.forName("UTF-8");
        MediaType mediaType = new MediaType("text", "html", utf8);
        headers.setContentType(mediaType);
        headers.set("User-Agent", "mozilla");
        headers.set("Accept-Language", "ko"); 
        // gzip 사용하면 byte[] 로 받아서, 압축을 풀고 decoding 해야 한다. 

        HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
        ResponseEntity<String> responseEntity = restTemplate.exchange(targetUrl.toURL().toString(), HttpMethod.GET, entity, String.class);
        String result = responseEntity.getBody();

        logger.info(result);

    }
}

I have solved this problem.我已经解决了这个问题。 I need to POST a string object in request body with UTF-8.我需要使用 UTF-8 在请求正文中发布一个字符串对象。

text/plain文本/纯文本

httpHeaders.setContentType(new MediaType("text", "plain", StandardCharsets.UTF_8)); httpHeaders.setContentType(new MediaType("text", "plain", StandardCharsets.UTF_8));

applicaton/json应用程序/json

httpHeaders.setContentType(new MediaType("applicaton", "json", StandardCharsets.UTF_8)); httpHeaders.setContentType(new MediaType("application", "json", StandardCharsets.UTF_8));

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resposeEntity = null;

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(new MediaType("text", "plain", StandardCharsets.UTF_8));

HttpEntity<String> httpEntity = new HttpEntity<String>(stringContent, httpHeaders);
responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, httpEntity, String.class);

if (HttpStatus.OK.equals(responseEntity.getStatusCode())) {
    logger.debug("... success ... result: " + responseEntity.getBody());
}

You can still use String.class as a response type if you can do the following.如果您可以执行以下操作,您仍然可以使用 String.class 作为响应类型。

Upgrading to spring-web 5.2 solves the problem.升级到 spring-web 5.2 解决了这个问题。 or set writeAcceptCharset property to false belongs to StringHttpMessageConverter and use that convertor further in RestTemplate instance.或将 writeAcceptCharset 属性设置为 false 属于 StringHttpMessageConverter 并在 RestTemplate 实例中进一步使用该转换器。

boolean writeAcceptCharSet = false;
List<HttpMessageConverter<?>> c = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> mc : c) {
  if (mc instanceof StringHttpMessageConverter) {
    StringHttpMessageConverter mcc = (StringHttpMessageConverter) mc;
    mcc.setWriteAcceptCharset(writeAcceptCharSet);
  }
}

In my case, I was using Postman.就我而言,我使用的是 Postman。 It was sending a hidden header of:它正在发送一个隐藏的标题:

Accept-Encoding: gzip, deflate, br

I removed this header and my response came back correctly, instead of mumbo-jumbos.我删除了这个标题,我的回复正确地返回了,而不是 mumbo-jumbos。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM