2014-12-22 12 views
13

Я использую Java Spring Resttemplate для получения json через запрос на получение. У JSON, который я получаю, вместо специального символа slike ü ö ä или ß какой-то странный материал. Поэтому я предполагаю, что что-то не так с кодировкой символов. Я не могу найти помощь в Интернете. Код, я использую сейчас является:Java Spring resttemplate кодировка символов

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

Что такое overPassStatementPostCode? Пожалуйста, размещайте больше кода, включая соответствующие POJO. –

+0

Вы устанавливаете 'String.class', который будет использовать' StringHttpMessageConverter'. Можете ли вы попытаться использовать «MappingJackson2HttpMessageConverter». Например. ' ArrayList > messageConverters = new ArrayList >(); messageConverters.add (новый MappingJackson2HttpMessageConverter()); restTemplate.setMessageConverters (messageConverters); ' – sol4me

+0

Рассматривая исходный код, мы также можем передать charset в StringHttpMessageConverter(), вы можете передать его' UTF-8' charset, потому что defaultCharSet является 'ISO-8859-1' – sol4me

ответ

46

Вам просто нужно добавить 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); 
+1

Решена проблема [моя кодировка] (http://stackoverflow.com/questions/28481118/utf-8-encoded-characters-from-rest-query-not-rendered-properly). Если вы хотите получить награду, напишите там ответ. В противном случае я свяжу его здесь и напишу собственный ответ. – john

+0

Ваше сообщение только что закончилось 2 часа вытягивания моих волос, спасибо человеку –

1

Сначала я попробовал @beerbajay путь «s, но это не помогает . в конце концов я решаю его ниже способом

 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); 
1

Я такой же вопрос по этому делу, после одного поиска, я получил эту ссылку: https://gist.github.com/knight1128/66f3e4817ab35c7397fd

его обходной путь работает для меня:

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); 

    } 
} 
Смежные вопросы