2014-12-22 15 views
13

Używam Java Resttemplate dla uzyskania json za pomocą żądania get. JSON, który otrzymuję, ma zamiast specjalnej postaci ü ö ä lub ß jakieś dziwne rzeczy. Domyślam się, że było coś nie tak z kodowaniem znaków. Nie mogę znaleźć żadnej pomocy w Internecie. Kod używam do teraz jest:Kodowanie znaków spoczynkowych Java Spring wiosna

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

Co jest overPassStatementPostCode? Proszę napisać więcej kodu, łącznie z odpowiednim POJO. –

+0

Ustawiasz 'String.class', który użyje' StringHttpMessageConverter'. Czy możesz spróbować użyć 'MappingJackson2HttpMessageConverter'. Na przykład. ' ArrayList > messageConverters = new ArrayList >(); messageConverters.add (new MappingJackson2HttpMessageConverter()); restTemplate.setMessageConverters (messageConverters); ' – sol4me

+0

Patrząc na kod źródłowy, możemy również przekazać zestaw znaków do StringHttpMessageConverter(), możemy przekazać zestaw znaków' UTF-8', ponieważ defaultCharSet to 'ISO-8859-1'' – sol4me

Odpowiedz

46

Wystarczy dodać StringHttpMessageConverter konwertery wiadomości szablonu za:

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

Rozwiązano problem [moje kodowanie] (http://stackoverflow.com/questions/28481118/utf-8-encoded-characters- from-rest-query-not-rendered-properly). Jeśli chcesz otrzymać nagrodę, napisz tam odpowiedź. W przeciwnym razie połączę go tutaj i napiszę własną odpowiedź. – john

+0

Twój wpis właśnie skończył 2 godziny wyrywania moich włosów, dzięki człowieku –

1

Najpierw próbowałem @beerbajay „s sposób, ale to nie pomaga . W końcu rozwiązać go poniżej sposób

 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

mam ten sam problem w tej sprawie, po jednym wyszukiwaniu, mam ten link: https://gist.github.com/knight1128/66f3e4817ab35c7397fd

jego obejście działa dla mnie:

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

    } 
}