Spring RestTemplate 사용법
in Spring on Spring-basics
1. RestTemplate
- Spring 3부터 지원하는 REST API 호출 이후 응답을 받을 때까지 기다리는 동기 방식
- 간편하게 REST 방식 API를 호출할 수 있는 spring 내장 클래스
// 빈등록하면서 설정 추가 가능
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
2. 주요 메서드
메서드 | HTTP | 설명 |
---|---|---|
getForObject | GET | 주어진 URL 주소로 GET 메서드로 객체로 결과를 반환 |
getForEntity | GET | 주어진 URL 주소로 GET 메서드로 객체로 결과를 ResponeEntity로 반환 |
postForLocation | POST | POST요청을 보내고 결과로 헤더에 저장된 URI를 결과로 반환 |
postForObject | POST | POST 요청을 보내고 객체로 결과를 반환 |
postForEntity | POST | POST 요청을 보내고 결과로 ResponseEntity로 반환 |
delete | DELETE | 주어진 URL 주소로 DELETE 메서드 실행 |
headForHeaders | HEADER | 헤더의 모든 정보를 얻을 수 있으면 GTTP HEAD 메서드 사용 |
put | PUT | 주어진 URL 주소로 PUT 메서드 실행 |
patchForObject | PATCH | 주어진 URL 주소로 PATCH 메서드 실행 |
optionsForAllow | OPTIONS | 주어진 URL 주소에서 지원하는 HTTP 메서드 조회 |
exchange | any | HTTP 헤더를 새로 만들 수 있고 어떤 HTTP 메서드도 사용 가능 |
execute | any | Request/Response 콜백 수정 가능 |
3. 사용 예시
postForEntity
// 헤더 만들기
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// HTTP Body로 들어갈 것들 만들기
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", kakaoClientId);
params.add("redirect_uri", baseUrl + kakaoRedirect);
params.add("code", code);
// Set http entity -> Body 데이터와 헤더 묶기
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
// url, request(헤더랑 파라미터 정보), response 타입
// 여기는 바디 데이터와 헤더가 필요해서 넣었지만
// 단순히 데이터만 넣어줘도 되는 경우 현재 request 자리에 해당 객체를 바로 넣어주면 된다.
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
// 전달받은 데이터를 gson 라이브러리를 사용해서 바로 매핑시킬 수 있음
if (response.getStatusCode() == HttpStatus.OK) {
return gson.fromJson(response.getBody(), RetKakaoAuth.class);
}
// 이런 식으로 바로 꺼낼 수도 있음
//Member member = restTemplate.getForEntity(builder.toUri(),Member.class).getBody();
exchange
// request url
String url = "https://jsonplaceholder.typicode.com/posts/{id}";
// create an instance of RestTemplate
RestTemplate restTemplate = new RestTemplate();
// create headers
HttpHeaders headers = new HttpHeaders();
// set `Content-Type` and `Accept` headers
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// example of custom header
headers.set("X-Request-Source", "Desktop");
// build the request
HttpEntity request = new HttpEntity(headers);
// make an HTTP GET request with headers
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.GET,
request,
String.class,
1 // uri 파라미터 값
);
4. TestRestTemplate
- 테스트를 위한 RestTemplate으로 사용방법은 위와 똑같다.
@Autowired
TestRestTemplate restTemplate;
ResponseEntity<Long> responseEntity = restTemplate.
postForEntitry(url,reqeustDto,Long.class);
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(responseEntity.getBody()).isGreaterThan(0L);