HttpClient가 필요할 때 Spring에서 제공하는 RestTemplate 을 주로 사용합니다.
그런데 연동해야하는 서버가 EUC-KR Encoding 만 지원하는 경우가 심심치 않게 있습니다.
이럴 때 파라미터를 EUC-KR 로 Encoding 해서 보내야하는데 RestTemplate 로 EUC-KR Encoding 을 못해 고생한 경험이 있어서 그 방법을 공유해 봅니다.
아래 코드를 기준으로 설명 드리겠습니다.
Case1 은 잘못된 Encoding 입니다.
Case2,3 은 정상입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.DefaultUriTemplateHandler; public class Test { // RestTemplate을 이용해 EUC-KR 인코딩으로 요청 보내기 public static void main(String[] args) throws UnsupportedEncodingException { String url = "http://google.com?q=" + URLEncoder.encode("테스트", "EUC-KR"); RestTemplate restOperations = new RestTemplate(); // Case 1 restOperations.getForObject(url, String.class); // Case2 restOperations.getForObject(URI.create(url), String.class); // Case3 DefaultUriTemplateHandler uriTemplateHandler = (DefaultUriTemplateHandler) restOperations.getUriTemplateHandler(); uriTemplateHandler.setStrictEncoding(true); restOperations.getForObject(url, String.class); } } |
Case1
- RestTemplate 은 기본적으로 org.springframework.web.util.DefaultUriTemplateHandler 을 사용해서 String url을 자동으로 Encoding 합니다.
- 그런데 DefaultUriTemplateHandler 는 "UTF-8" 로 Encoding 이 Hard coding 되어 있어서 변경이 불가합니다.
- 그래서 Case1의 경우는 12 Line에서 EUC-KR로 encoding한 문자열을 자동으로 UTF-8로 다시 한번 Encoding 합니다.
Created GET request for "http://google.com?q=%25C5%25D7%25BD%25BA%25C6%25AE" |
Case2
- String url로 넘기지않고 URI 객체를 넘기면 자동으로 Encoding 을 하지 않기 때문에 정상 동작합니다.
Created GET request for "http://google.com?q=%C5%D7%BD%BA%C6%AE" |
Case3
- String url로 넘기더라도 DefaultUriTemplateHandler 의 설정에서 setStrictEncoding 을 true로 설정하면 자동으로 Encoding을 하지 않기 때문에 정상 동작합니다.
Created GET request for "http://google.com?q=%C5%D7%BD%BA%C6%AE" |
** 참고.
Spring RestTemplate Encoding 이라고 Googling을 하면 org.springframework.http.converter.StringHttpMessageConverter 이 많이 출현하는데 이 녀석 때문에 삽질을 많이 했죠. 무식이 죄 ㅜㅜ.
StringHttpMessageConverter 는 Request가 아닌 Response의 Encoding을 처리한다고 보시면 됩니다.
'java' 카테고리의 다른 글
java - pretty log - 예쁜 로그를 남기자! (0) | 2018.08.30 |
---|---|
java php aes ecb nopadding (2) | 2018.08.29 |
enum fasterxml jackson Serializing and DeSerializer (0) | 2018.08.24 |
[tomcat-jdbc] Found class org.apache.juli.logging.Log, but interface was expected (0) | 2018.08.24 |
spring boot main args - ApplicationArguments (0) | 2018.08.16 |
java file create time (0) | 2018.08.13 |
org.apache.ibatis.type.TypeException: Could not resolve type alias (4) | 2018.08.09 |
mybatis large result set. 대용량 select. fetchSize (0) | 2018.08.07 |