Spring RestTemplate 사용하기
- -
RestTemplate 란?
Spring 에서 간편하게 Rest 방식 API 를 호출할 수 있는 내장 클래스이다.
Spring 3.0 부터 지원되며 응답은 Json, xml 모두 받을 수 있다.
Rest API 요청 시 응답 받을 수 있도록 설계되어 있으며, HTTP 메소드(GET, POST, PUT, DELETE)들에
적합한 여러 메소드들을 제공한다.
RestTemplate 특징
- Rest API 를 간편하게 호출 후 응답 받을 수 있는 Spring 내장 클래스
- Spring 3.0 부터 지원하는 HTTP 통신 템플릿
- HTTP 요청 후 Json, XML, String 등 여러 형태로 응답 받을 수 있는 템플릿
- HTTP HEADER, Content-Type 등을 설정하여 외부 API 호출
- Server to Server 통신
RestTemplate 동작원리
1. Rest API 요청을 위해 RestTemplate 객체를 생성하여 메서드를 호출한다.
2. RestTemplate 는 MessageConverter 를 이용해 Request Body(요청 Body) 에 담을 Message(Json, xml) 로
변환한다. Request 데이터에 따라 Message 형태는 다르다.
3. ClientHttpRequestFactory 에서 ClientHttpRequest 을 받아와 요청을 전달한다.
4. 실질적으로 ClientHttpRequest 가 HTTP 통신으로 요청을 수행한다.
5. RestTemplate 가 에러 핸들링을 한다.
6. ClientHttpResponse 에서 응답데이터를 가져와 에러 핸들링 및 응답 데이터를 전달한다.
7. MessageConverter 를 이용해 응답 데이터에 담기 위해 Java 객체로 변환한다.
8. 결과를 요청한 어플리케이션으로 반환한다.
RestTemplate 메서드
getForObject : Object | GET | GET 방식 요청으로 결과를 객체로 반환 |
getForEntity : ResponseEntity | GET | GET 방식 요청으로 결과를 ResponseEntity로 반환 |
postForLocation | POST | POST 방식 요청으로 결과를 헤더에 저장된 URI로 반환 |
postForObject : Object | POST | POST 방식 요청으로 결과를 객체로 반환 |
postForEntity : ResponseEntity | POST | POST 방식 요청으로 결과를 ResponseEntity로 반환 |
delete | DELETE | DELETE 방식 요청으로 메서드 실행 |
headForHeaders | HEADER | 헤더의 정보를 얻을 수 있고, HTTP HEAD 메서드 사용 |
put | PUT | HTTP PUT 메서드를 실행 |
patchForObject | PATCH | HTTP PATCH 메서드를 실행 |
optionsForAllow | OPTIONS | 지원하는 HTTP 메서드 조회 |
exchange : ResponseEntity | any | 헤더 생성 및 어떤 요청이든 사용 가능 |
execute | any | Request/Response 콜백을 수정할 수 있음 |
RestTemplate 사용 예시
1. RestTemplate 사용을 위한 Maven 의존성 추가
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.15</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
pom.xml 에 추가 후 프로젝트 마우스 오른쪽 버튼 > Maven > Update Project... > Update
2. RestTemplate 생성 후 Rest API 요청
Rest API 요청을 위해 RestTemplate 객체를 생성하고 Header, URL, 응답 객체 등 설정하여
RestTemplate 의 exchange 메서드를 통해 API 요청을 한다.
Rest API 요청 서버
@GetMapping(value="/login/main")
public String login() {
// RestTemplate 객체 생성
RestTemplate restTemplate = new RestTemplate();
// HTTP Header 설정
HttpHeaders header = new HttpHeaders();
header.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
header.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> entity = new HttpEntity<>(header);
// Server to Server 로 인해 로컬 환경의 api 서버에 요청 - 서버 URL
String api_url = "http://localhost:8080/api/test";
// 요청 URL 객체 생성
UriComponentsBuilder uri = UriComponentsBuilder.fromHttpUrl(api_url);
// RestTemplate exchange 메서드를 통해 Rest API 요청
ResponseEntity<Map> response = restTemplate.exchange(uri.build().toUriString(), HttpMethod.GET, entity, Map.class);
System.out.println("return : "+response.getBody().toString());
return "contents/auth/loginForm";
}
// Server to Server 로 인해 로컬 환경의 api 서버에 요청 - 서버 URL
String api_url = "http://localhost:8080/api/test";
// 요청 URL 객체 생성
UriComponentsBuilder uri = UriComponentsBuilder.fromHttpUrl(api_url);
인터넷상에 존재하는 모든 자원들은 URI 를 통해 구분되고 접근할 수 있다.
따라서, 웹 어플리케이션을 개발할 때 어떤 데이터에 접근하고 리턴하기 위해선 내부적으로 URI 를
이용해 응답해준다.
URI 의 구조는 아래와 같으며 개발자가 URI 를 직접 문자열로 작성하는것은 상당히 불편하다.
요청할 곳의 URI 가 간단하다면 상관 없지만 복잡 해질수록 작성하는게 불편할 수 있다.
이러한 URI 를 보다 쉽게 다룰 수 있도록 도와주는게 UriComponentsBuilder 이다.
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
ResponseEntity<Map> response = restTemplate.exchange(uri.build().toUriString(), HttpMethod.GET, entity, Map.class);
헤더 설정 및 Http Method 중 골라서 API 요청을 할 수 있는 exchange 메서드를 사용한다.
exchange
(
url : API 요청 URL,
method : HTTP Method(GET, POST, PUT, DELETE),
requestEntity : 요청 객체(Header 객체, 전달할 데이터 등),
responseType : 응답 객체 타입,
uriVariables : 응답 받을 객체 형태
)
httpEntityCallBack() 메서드를 통해 요청 헤더, 데이터 등 설정한 HttpEntity 와 응답 Type을 설정한다.
RestTemplate 클래스 밑에 존재하는 HttpEntityRequestCallback 클래스이다.
전달받은 요청 객체인 HttpEntity 설정 및 super(responseType) 을 통해 응답 객체의 Type을 설정한다.
responseEntityExtractor() 메서드를 통해 응답 객체에 대한 알맞는 MessageConverter 를
설정한다. responseType 은 응답 객체 클래스를 설정하는데 본인은 Map.class 를 설정했다.
excute(), doExcecute() 메서드를 통해 요청 객체에 대한 messageConverter 설정 및 API 요청을 한다.
createRequest() 메서드를 통해 ClientHttpRequestFactory 에서 ClientHttpRequest 를 가져온다.
doWithRequest() 메서드를 통해 요청 객체인 HttpEntity 를 알맞는 객체로 변환하기 위해
MessageConverter 찾아 변환한다.
Rest API 요청을 받는 서버 - 응답 서버
package com.example.demo.controller;
import java.util.HashMap;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
public class RestController {
@RequestMapping(value="/api/test")
public HashMap<String, Object> apiTest(){
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("test", 123);
System.out.println("들어왔어요");
return map;
}
}
결과
'Java > Spring' 카테고리의 다른 글
Java Enum (0) | 2023.09.14 |
---|---|
@ControllerAdvice (0) | 2023.08.28 |
Spring Boot 2.7 이상, Spring Security 5.6 이상버전 설정하기 (0) | 2023.07.11 |
html 을 이용한 대용량 파일 다운로드 (0) | 2023.07.03 |
Java Generic(제네릭) (0) | 2023.06.26 |
소중한 공감 감사합니다