REST查询中的UTF-8编码字符未正确呈现

joh*_*ohn 3 rest grails character-encoding

我正在使用外部REST服务,它提供所有内容为UTF-8编码.

由于某种原因,我的应用程序无法正确处理响应.如果我拒绝回复,我会选择LuleÃ¥(应该是Luleå).

编辑:如果我转发(不改变)字符串到UI,同样的行为发生,例如:

flash.message = "Test" + integrationService.testEncoding()
Run Code Online (Sandbox Code Playgroud)

我所做的是在/ script文件夹中创建一个_Events.groovy文件并指定它

eventConfigureTomcat = { tomcat ->
    tomcat.connector.URIEncoding = "UTF-8"
    tomcat.connector.useBodyEncodingForURI = true
}
Run Code Online (Sandbox Code Playgroud)

我也有以下内容Config.groovy:

grails.views.gsp.encoding = "UTF-8"
grails.converters.encoding = "UTF-8"
Run Code Online (Sandbox Code Playgroud)

但这没有改变.答案仍然错误地显示出来.我不确定这是Grails的配置问题,嵌入式tomcat还是其他东西.我目前正在Windows 7上运行我的测试设置,但同样的问题发生在我在Centos上运行的服务器上.请指教.

编辑2:如果我使用curl使用REST服务,则在输出中正确呈现所有内容.

编辑3:我正在使用org.springframework.web.client.RestTemplateHttpComponents使用该服务:

private static final HttpHeaders requestHeaders
static{
    requestHeaders = new HttpHeaders()
    requestHeaders.set(HttpHeaders.CONTENT_TYPE, "application/json")
    requestHeaders.set(HttpHeaders.ACCEPT, "application/json")
    requestHeaders.set("Accept-Encoding", "gzip")
}

private final static RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(
    HttpClientBuilder.create().build()))
...
...
public def testEncoding(){
    ResponseEntity<String> response = restTemplate.exchange(
            "https://www.url.com", HttpMethod.GET, new HttpEntity<Object>(requestHeaders),
            String.class)
    def gamesJson = JSON.parse(response.getBody())
    //...
    //parse value from gamesJson
    //...
    return testValue
}
Run Code Online (Sandbox Code Playgroud)

bee*_*jay 7

根据我之前的回答:

您只需要添加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);
Run Code Online (Sandbox Code Playgroud)