Search code examples
javaspring-webfluxwebclient

webclient retrieve() vs exchangeToMono() nothing working for this use case


API (Name it as api-1) has following property -

  1. For 2XX it can return body
  2. For 5XX it doesn’t return body

In another API (api-2), Our requirement is if api-1 status code is 2XX return “ABC” else return “XYZ” from webclient call, So we don’t wanted to consume response body in either cases.

Which one should work retrieve() or exchangeToMono() ?

When I use retrieve() I couldn’t return ABC or XYZ based on http response. If I use exchangeToMono() I was getting InvalidStateException with following message “The underlying HTTP client completed without emitting a response.”

Any help is appreciated.


Solution

  • Here is my approach.

    String result = client
            .get()
            .uri("http://localhost:8080/endpoint")
            .retrieve()
            .toBodilessEntity()
            .onErrorResume(WebClientResponseException.class, e -> Mono.just(ResponseEntity.status(e.getStatusCode()).build()))
            .map(entity -> entity.getStatusCode().isError() ? "error" : "ok")
            .block();
    

    result is equal to ok when the request is completed successfully, and error otherwise.

    You can change the condition in map if you want to return error only on 5xx exceptions.

    EDIT: Or as Toerktumlare mentioned in his comment, you can use onStatus to omit an exception.

    String result = client
            .get()
            .uri("http://localhost:8080/endpoint")
            .retrieve()
            .onStatus(HttpStatus::isError, e -> Mono.empty())
            .toBodilessEntity()
            .map(entity -> entity.getStatusCode().isError() ? "error" : "ok")
            .block();