봉봉의 개인 블로그
2019-08-01 [카테고리 미분류](WebClient) 본문
WebClient
Spring 5 와 Spring boot 2.0 부터 AsyncRestTemplate 가 deprecated 되었다. 그래서 비동기식으로 요청을 하려면 WebClient를 이용해야 한다.
RestTemplate
- RestTemplate 는 WebClient보다 이전에 나왔다.
- RestTemplate는 동기식이며, response가 올 때까지 다음 행동으로 넘어갈 수 없다.
- RestTemplate는 곧 deprecated 될것이다..
WebClient
WebClient는 웹요청을 하는데 있어 출입문 역할을 하는 인터페이스이다.
Spring Web Reactive 모듈에 포함되어 있으며, RestTemplate를 대체한다.
설치 및 의존성 설정
- dependencies 추가를 해줘야 한다.
WebClient instance 생성
프로젝트 소스코드에서는 builder패턴을 사용하여 인스턴스를 만든다.
WebClient client = WebClient
.builder()
.baseUrl("http://localhost:8080")
.defaultCookie("쿠키키","쿠키값")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
Request 요청하기
1. HTTP 메소드를 정한다.
WebClient.UriSpec<WebClient.RequestBodySpec> req = client.post();
2. 두번째 uri API를 제공. String 포맷 혹은 java.net.URL 포맷으로 넘긴다.
WebClient.RequestBodySpec uri = client
.post()
.uri("/search");
3. 필요하다면 Request에 body, content-type,length, cookie, header 등을 포함할 수 있다.
WebClient.RequestHeadersSpec<?> req2 = client.post().
.uri("/search")
.body(BodyInserters.fromObejct("data"));
아예 다르게 접근할 수도 있다. 원하는 uri를 직접 만들어 요청하는 방식이다.
private final WebClient.RequestHeaderUriSpec<?> baseSpec;
baseSpec = Webclient.builder().baseUrl("주소").build().get();
// baseSpec에 원하는 파라미터를 추가로 붙여서 요청한다.
baseSpec.uri(builder -> builder.path("/")
.queryParam("이름","값")
.builder()
).retrieve() // Response를 받아옴.
Response 받아오기
이 과정에는 두 방법이 있다.
- exchange는 ClientResponse를 상태값 그리고 헤더와 함께 가져오는 반면에,
- retrieve 는 body를 바로 가져온다.
String response = req.exchange().block().bodyToMono(String.class).block();
String response2 = req2.retrieve().bodyToMono(String.class).block();
여기서 bodyToMono 는 가져온 body를 Reactor의 Mono 객체로 바꿔준다. Mono 객체는 0-1개의 결과를 처리하는 객체이고, 반면 Flux 는 0-N개인 결과를 처리하는 객체!
위에서 block 을 사용하면 Rest Template처럼 동기식으로 사용할 수 있다고 했다.
block을 Mono에 사용하여, response와 함께 전송된 실제 데이터를 구독하고 얻어 올 수 있다!
-출처 : https://junebuug.github.io/2019-02-11/resttemplate-vs-webclient
Comments