반응형

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을 처리한다고 보시면 됩니다.


반응형

+ Recent posts