sitelink1 | http://messenger.tistory.com/entry/Sprin...9%EB%B2%95 |
---|---|
sitelink2 | |
sitelink3 | |
extra_vars6 |
UTF-8 한글 JSON 데이터를 RestTemplate을 이용하여 '홍길동' 같이 한글을 전송하면 '???'으로 받아지는 경우가 있다.
문제의 코드
<API사용 Client>
import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; ... RestTemplate rest = new RestTemplate(); MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); parts.add("name", "홍길동); parts.add("email", "hong@yourdomain"); String url = UriComponentsBuilder.fromHttpUrl("http://yourdomain").pathSegment("add").build().toString(); String response = rest.postForObject(url, parts, String.class);
|
<서버 코드>
@RequestMapping(method = RequestMethod.POST, value="/add", produces = "application/json") @ResponseBody Result add( MultipartHttpServletRequest request, @RequestParam("name") String name, @RequestParam("email") String email ) throws IOException { // name의 '홍길동'이 '???'으로 받아진다 } |
원인은 RestTemplate에서 내부적으로 StirngHttpMessageConverter를 사용해서 데이터를 변환하는데
이때 사용하는 인코딩이 'ISO-8859-1'이기 때문이다. (무조건)
그래서 Client코드에서 아래와 같이 'UTF-8'으로 지정해주면 간단하게 해결된다.
<변경된 API사용 Client>
import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; ... RestTemplate rest = new RestTemplate(); MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); HttpEntity<String> name = new HttpEntity<>("홍길동", headers); parts.add("name", name); parts.add("email", "hong@yourdomain"); String url = UriComponentsBuilder.fromHttpUrl("http://yourdomain").pathSegment("add").build().toString(); String response = rest.postForObject(url, parts, String.class);
|