Spring 3.0 부터 지원
HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지키는 HTTP 통신 template이다. RESTful 클라이언트는 HTTP Method(GET, POST, PUT, DELETE, HEAD, OPTIONS)를 모두 지원한다. 결과는 문자열 그대로 받을 수도 있으며, Converter를 이용해 Object로 변환할 수 있다.
-
Synchronous API
-
기계적이고 반복적인 코드를 최대한 줄여준다.
RestTemplate은 org.springframework.http.client
패키지에 있으며, HttpClient 를 추상화해서 HttpEntity의 json, xml 등 제공해준다.
-
어플리케이션이
RestTemplate
을 생성하고, URI, HTTP Method 등의 header 담아 요청 -
RestTemplate
은HttpMessageConverter
를 사용하여requestEntity
를 요청메세지로 변환 -
RestTemplate
은ClientHttpRequestFactory
로 부터ClientHttpRequest
를 가져와 요청 -
ClientHttpRequest
는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신 -
RestTemplate
는ResponseErrorHandler
로 오류를 확인 -
ResponseErrorHandler
는 오류가 있다면ClientHttpResponse
에서 응답데이터를 가져와서 처리 -
RestTemplate
는HttpMessageConverter
를 이용해 응답메세지를 java object(Class responseType) 로 변환
Method | HTTP | 설명 |
---|---|---|
exchange | any | HTTP header setting 가능, ResponseEntity로 반환 |
execute | any | Request/Response 콜백을 수정 가능 |
getForObject | GET | Java Object로 반환 |
getForEntity | GET | ResponseEntity로 반환 |
postForLocation | POST | java.net.URI 로 반환 |
postForObject | POST | Java Object로 반환 |
postForEntity | POST | ResponseEntity로 반환 |
delete | DELETE | HTTP DELETE 메서드를 실행 |
headForHeaders | HEAD | 헤더의 모든 정보를 얻을 수 있으면 HTTP HEAD 메서드를 사용 |
put | PUT | HTTP PUT 메서드를 실행 |
patchForObject | PATCH | HTTP PATCH 메서드를 실행 |
optionsForAllow | OPTIONS | 주어진 URL 주소에서 지원하는 HTTP 메서드를 조회 |
그 중에 HTTP header를 설정할 수 있는 exchange
에 대해서 자세히 알아볼 것이다.
// Header 설정
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); // application/json
headers.set("apikey", "apikeyvalue"); // API에 따라 key 값을 설정
다음과 같이 HttpHeaders
로 header 값들을 설정할 수 있다. headers는 HttpEntity
에 보내줄 파라미터와 함께 설정해준다.
UricomponentsBuilder
는 여러개의 파라미터를 연결해 하나의 URI로 만들어 반환해준다.
// example : https://example.api.com/m/item?channelCode=30001001&count=3
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://example.api.com");
builder.path("/m/item")
.queryParam("channelCode", "30001001")
.queryParam("count", 3);
String apiUrl = builder.build().encode().toUriString();
requestBody 값으로 보내줄 파라미터들은 Map<>
으로 각자 데이터 형태에 맞게 생성해준다.
// ajax 통신시 data에 들어가는 값
Map<String, Object> requestBody = new HashMap<String, Object>();
requestBody.put("category_type", categoryType);
이제 HttpEntity
에 headers와 requestBody 객체를 담아준다.
HttpEntity<Map<String, Object>> sendData = new HttpEntity<>(requestBody, headers);
만약 timeout을 설정하려면 HttpComponentsClientHttpRequestFactory
객체를 생성해 설정할 수 있다.
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(3000); // 3초
factory.setReadTimeout(3000); // 3초
RestTemplate
으로 이제 HTTP 통신을 할 수 있다.
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(factory); // timeout 설정
ResponseEntity<Map> response = restTemplate.exchange(apiUrl, HttpMethod.POST, sendData, Map.class);