sai23
sai23

Reputation: 139

Spring webflux, use response from api1 to call api2 and api3 and use it to build final response

I need to construct a JSON from 3 api calls.

  1. Call webclient1.get() -> response1
  2. Use reponse1 to call second api like this: webclient2.getDetails(response1.getId())
  3. Use reponse1 to call third api like this: webclient3.getDetails(response1.getId())

Sample code

private Mono<RequestPayload> buildRequestPayload(Request request) {
    RequestPayload requestPayload = null;
    Mono<T> response1 = webclient1.get(request.getId());
    response1.flatMap(res -> {
        return webclient2.getDetails(res.getId());
        //not sure how to call webclient3.getDetails(response1.getId()) after return statement
    });
    //I think the final one should be something like this (not sure though) but did not get until here
    return Mono.zip(respons1, resppnse2, response3).flatMap(finalResponse -> {
       requestPayload.setResponse1(finalResponse.getT1());
       requestPayload.setResponse2(finalResponse.getT2());
       requestPayload.setResponse3(finalResponse.getT3());
     });
}

I'm getting null in the pipeline not sure where the error is

Upvotes: 1

Views: 95

Answers (1)

lkatiforis
lkatiforis

Reputation: 6255

You should chain all of your operations in order to create a reactive stream. You can accomplish this using flatmap and map operators:

private Mono<RequestPayload> buildRequestPayload(Request request) {
    return executeRequest1()
        .flatMap(request1Result ->
            executeRequest2()
                .map(request2Result -> RequestPayload.builder()
                    .response1(request1Result)
                    .response2(request2Result)
                    .build()))
        .flatMap(requestPayload ->
            executeRequest3()
                .map(request3Result -> {
                    requestPayload.response3(request3Result);
                    return requestPayload;
                })
        );
}

Upvotes: 1

Related Questions