스프링 프레임워크는 REST 엔드포인트로 다음 세 가지를 제공한다.
WebClient
RestTemplate
HTTP Interface
WebClient
는 HTTP 요청을 처리하는 non-blocking, 반응형 클라이언트다.WebClient
는 다음을 지원한다.
RestTemplate
을 통해 한 줄로 Rest 엔드포인트를 쉽게 호출할 수 있다.
RestTemplate
은 유지 관리 모드에 있으며, 사소한 변경 및 버그에 대한 요청만 수행된다.WebClient
의 사용을 권장한다.
@HttpExchange
메서드를 가지는 인터페이스를 선언
@GetExchange
뿐만 아니라 다른 HTTP 메서드 어노테이션도 지원한다.interface RepositoryService {
@GetExchange("/repos/{owner}/{repo}")
Repository getRepository(@PathVariable String owner, @PathVariable String repo);
// more HTTP exchange methods...
}
WebClient client = WebClient.builder()
.baseUrl("https://api.github.com/")
.build();
HttpServiceProxyFactory factory = HttpServiceProxyFactory
.builder(WebClientAdapter.forClient(client))
.build();
RepositoryService service = factory.createClient(RepositoryService.class);
어노테이션 기반 HTTP 메서드는 다음과 같은 매개변수 사용을 지원한다.
Method argument | Description |
---|---|
URI |
어노테이션의 URL 속성을 재정의하여 요청에 대한 URL을 동적으로 설정한다. |
HttpMethod |
어노테이션의 메서드 속성을 재정의하여 요청에 대한 HTTP 메서드를 동적으로 설정 |
@RequestHeader |
요청 헤더 또는 여러 헤더를 추가한다. 인수는 여러 헤더가 있는 Map<String, ?> 또는 MultiValueMap<String, ?> , Collection<?> , 또는 개별 값일 수 있다. 타입 변환은 String 이 아닌 값에 대해 지원된다. |
@PathVariable |
요청 URL에 플레이스홀더 확장을 위한 변수를 추가한다. 인수는 여러 변수가 포함된 Map<String, ?> 이거나 개별 값일 수 있다. String 이 아닌 값에 대해서는 유형 변환이 지원된다. |
@RequestBody |
요청의 body를 직렬화할 객체 또는 Mono , Flux 와 같은 반응형 스트림 Publisher , 또는 구성된 ReactiveAdapterRegistry 를 통해 지원되는 기타 비동기 유형으로 제공하면 된다. |
@RequestParam |
요청 매개변수 또는 여러 매개변수를 추가한다. 인수는 여러 매개변수가 포함된 Map<String, ?> 또는 MultiValueMap<String, ?> , Collection<?> , 또는 개별 값일 수 있습니다. String이 아닌 값에 대해 유형 변환이 지원된다. content-type 이 application/x-www-form-urlencoded 로 설정된 경우 요청 매개변수는 요청 본문에서 인코딩된다. 그렇지 않으면 URL 쿼리 매개변수로 추가된다. |
@RequestPart |
요청 파트는 문자열(양식 필드), Resource (파일 파트), 오브젝트(인코딩할 엔티티, 예: JSON), HttpEntity (파트 콘텐츠 및 헤더), 스프링 파트 또는 위의 모든 것의 리액티브 스트림 Publisher중 하나 일 수 있다. |
@CookieValue |
쿠키 하나 또는 여러 개의 쿠키를 추가한다. 인수는 여러 쿠키가 포함된 Map<String, ?> 또는 MultiValueMap<String, ?> , 값의 Collection<?> 또는 개별 값일 수 있다. String이 아닌 값에 대해서는 유형 변환이 지원된다. |
Method return value | Description |
---|---|
void ,Mono<Void> |
주어진 요청을 수행하고 응답 콘텐츠가 있으면 보여준다. |
HttpHeaders ,Mono<HttpHeaders> |
주어진 요청을 수행하고 응답 콘텐츠(있는 경우)를 릴리스한 다음 응답 헤더를 반환한다. |
<T> , Mono<T> |
주어진 요청을 수행하고 응답 내용을 선언된 반환 유형으로 디코딩한다. |
<T> , Flux<T> |
주어진 요청을 수행하고 응답 콘텐츠를 선언된 요소 유형의 스트림으로 디코딩한다. |
ResponseEntity<Void> , Mono<ResponseEntity<Void>> |
주어진 요청을 수행하고 응답 콘텐츠(있는 경우)를 릴리스하고 상태 및 헤더가 포함된 ResponseEntity를 반환한다. |
ResponseEntity<T> , Mono<ResponseEntity<T>> |
주어진 요청을 수행하고, 응답 콘텐츠를 선언된 반환 유형으로 디코딩한 다음, 상태, 헤더, 디코딩된 본문이 포함된 ResponseEntity를 반환한다. |
Mono<ResponseEntity<Flux<T>> |
주어진 요청을 수행하고, 응답 콘텐츠를 선언된 엘리먼트 유형의 스트림으로 디코딩한 다음, 상태, 헤더, 디코딩된 응답 본문 스트림이 포함된 ResponseEntity를 반환한다. |
WebClientResponseException
을 발생시킨다.WebClient webClient = WebClient.builder()
.defaultStatusHandler(HttpStatusCode::isError, resp -> ...)
.build();
WebClientAdapter clientAdapter = WebClientAdapter.forClient(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory
.builder(clientAdapter).build();
WebClient.Builder
의 defaultStatusHandler
를 보면 된다.