SpringBoot RestTemplate example 정의 및 사용방법 예제
RestTemplate 이란?
- Spring 3.0부터 지원되는 REST API 호출 이후 응답을 받을 때까지 기다리는 동기 방식으로 http 통신에 유용하게 쓸 수 있는 템플릿
- http 서버와의 통신을 단순화하고 Restful 원칙을 지킨다.
- JSON, XML을 쉽게 응답받는다.
RestTemplate 동작구조
- HttpClient는 Http를 사용하여 통신하는 범용 라이브러리이고 RestTemplate는 HttpClient를 추상화 (HttpEntity의 JSON, XML 등) 으로 제공한다.
① Application이 RestTemplate를 생성하고 URI, HTTP 메소드 등의 헤더를 담아서 Request 한다.
② RestTemplate는 HttpMessageConverter 클래스를 사용하여 requesetEntity를 요청 메시지로 변환한다.
③ RestTemplate는 ClientHttpRequestFactory로부터 ClientHttpRequest 정보를 받아와 request 한다.
④ ClientHttpRequest 는 요청메시지를 만들어 Http 프로토콜을 통해 API 서버와 통신한다.
⑤ RestTemplate 는 ResponseErrorHandler 인터페이스로 오류가 있는지 확인하고 처리 로직을 실행
⑥ ResponseErrorHandler 는 오류가 있으면 ClientHttpResponse 에서 응답 데이터를 받아와서 처리한다.
⑦ RestTemplate 는 HttpMessageConverter 클래스를 이용해서 응답 데이터를 JAVA Object로 변환
⑧ Application 으로 반환한다. ( JSON, XML )
사용 예제
① apiClientHttpEntity 메소드
- RestTemplate 헤더를 생성한다.
/**
* headers parameter
* @param params
* @return
*/
public HttpEntity<?> apiClientHttpEntity(String params) {
HttpHeaders reqHeaders = new HttpHeaders();
reqHeaders.set("X-Client-Id", this.getACCESS_KEY());
reqHeaders.set("X-Client-Secret", this.getSECRET_KEY());
reqHeaders.set("Content-type", "application/json");
reqHeaders.set("Accept", "application/json");
return new HttpEntity<Object> (params, reqHeaders);
}
② apiCall 메소드
- apiClientHttpEntity 에 전송할 파라미터 데이터를 담아서 RestTemplate 로 호출한다.
- responseEntity.getBody() 데이터를 리턴한다.
@ResponseBody
@RequestMapping(value = "/apiCall")
public ResponseEntity<JSONObject> apiCall(HttpServletRequest request, HttpServletResponse response) throws ClientProtocolException, IOException {
boolean pass = false;
JSONObject param = new JSONObject();
param.put("APP_KEY", this.getACCESS_KEY());
HttpEntity<?> requestEntity = apiClientHttpEntity(param.toString());
RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
restTemplate.getMessageConverters().add(converter);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(URL, HttpMethod.POST, requestEntity, JSONObject.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("retMessage", responseEntity.getBody().get("MESSAGE"));
map.put("retMessageCode", responseEntity.getBody().get("MESSAGE_CODE"));
map.put("status", responseEntity.getBody().get("STATUS"));
try {
apiService.insertLog(map);
pass = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if(!pass) {
JSONObject retJson = new JSONObject();
retJson.put("MESSAGE_CODE", "4444");
retJson.put("MESSAGE", "알수없는 오류가 발생했습니다.\r\n관리자에게 문의하세요.");
return ResponseEntity.ok(retJson);
}
}
return ResponseEntity.ok(responseEntity.getBody());
}