Spring Web Reactive | 2. WebClient | 2.3. Exchange

exchangeToMono() 메소드와 exchangeToFlux() 메소드 (또는 Kotlin에서 awaitExchange { }exchangeToFlow { })는 응답 상태에 따라 다르게 응답을 디코딩하는 등의 고급 제어가 필요한 고급 케이스에 도움이 된다.

Java

Mono<Object> entityMono = client.get()
        .uri("/persons/1")
        .accept(MediaType.APPLICATION_JSON)
        .exchangeToMono(response -> {
            if (response.statusCode().equals(HttpStatus.OK)) {
                return response.bodyToMono(Person.class);
            }
            else if (response.statusCode().is4xxClientError()) {
                // Suppress error status code
                return response.bodyToMono(ErrorContainer.class);
            }
            else {
                // Turn to error
                return response.createException().flatMap(Mono::error);
            }
        });

Kotlin

val entity = client.get()
  .uri("/persons/1")
  .accept(MediaType.APPLICATION_JSON)
  .awaitExchange {
        if (response.statusCode() == HttpStatus.OK) {
             return response.awaitBody<Person>()
        }
        else if (response.statusCode().is4xxClientError) {
             return response.awaitBody<ErrorContainer>()
        }
        else {
             throw response.createExceptionAndAwait()
        }
  }

위를 사용하는 경우, 반환된 Mono 또는 Flux가 완료된 후에, 응답 본문을 확인하고 사용되지 않았으면 메모리와 연결 누수가 방지하기 위해 해제된다. 따라서 응답은 더 이상 다운스트림으로 디코딩 할 수 없다. 필요에 따라 응답을 해독하는 방법을 선언하는 것은 제공된 함수 달려 있다.




최종 수정 : 2021-04-12