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の完了後にレスポンスボディが確認され、未使用の場合はメモリーと接続のリークを防ぐために解放されます。その後、レスポンスをダウンストリームでデコードすることはできません。必要に応じたレスポンスのデコード方法は、指定した関数で宣言します。