Spring RestTemplate 사용법

1. RestTemplate


  • Spring 3부터 지원하는 REST API 호출 이후 응답을 받을 때까지 기다리는 동기 방식
  • 간편하게 REST 방식 API를 호출할 수 있는 spring 내장 클래스
// 빈등록하면서 설정 추가 가능
@Bean
public RestTemplate getRestTemplate(){
    return new RestTemplate();
}


2. 주요 메서드


메서드HTTP설명
getForObjectGET주어진 URL 주소로 GET 메서드로 객체로 결과를 반환
getForEntityGET주어진 URL 주소로 GET 메서드로 객체로 결과를 ResponeEntity로 반환
postForLocationPOSTPOST요청을 보내고 결과로 헤더에 저장된 URI를 결과로 반환
postForObjectPOSTPOST 요청을 보내고 객체로 결과를 반환
postForEntityPOSTPOST 요청을 보내고 결과로 ResponseEntity로 반환
deleteDELETE주어진 URL 주소로 DELETE 메서드 실행
headForHeadersHEADER헤더의 모든 정보를 얻을 수 있으면 GTTP HEAD 메서드 사용
putPUT주어진 URL 주소로 PUT 메서드 실행
patchForObjectPATCH주어진 URL 주소로 PATCH 메서드 실행
optionsForAllowOPTIONS주어진 URL 주소에서 지원하는 HTTP 메서드 조회
exchangeanyHTTP 헤더를 새로 만들 수 있고 어떤 HTTP 메서드도 사용 가능
executeanyRequest/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);

© 2021. By Backtony