Spring WebClient Call Two Зависимый API - PullRequest
0 голосов
/ 31 января 2020

У меня есть две конечные точки, первая для http://localhost:8899/api/composition/appraisal, которая будет возвращать все данные оценки производительности

[
    {
        "appraisalId": "ac234fbf-740c-4390-89d4-0e9753ad4d70",
        "employeeId": "emp-4613",
        "grade": "VERY_GOOD",
        "score": 94,
        "status": "NEW"
    },
    {
        "appraisalId": "e9baf663-aa6e-4af8-ae16-ef50c886df28",
        "employeeId": "emp-4623",
        "grade": "VERY_GOOD",
        "score": 94,
        "status": "NEW"
    }
]

У меня также есть другая конечная точка для получения бонусных данных http://localhost:8888/api/composition/bonus/{appraisal_id}, которые возвращают бонусные данные на основе id оценки

{
    "appraisalId": "ac234fbf-740c-4390-89d4-0e9753ad4d70",
    "bonusAmount": 4760.0,
    "bonusPaidDate": "2019-06-30",
    "employeeId": "emp-4623",
    "paidToBankAccount": "8240996587"
}

Давая appraisal_id из первого API в качестве параметра, я должен объединить результат обоих вызовов API в PerformanceAppraisalWithBonus. java class

public class PerformanceAppraisalWithBonus {
    private UUID appraisalId;
    private double bonusAmount;
    private LocalDate bonusPaidDate;
    private String employeeId;
    private String grade;
    private int score;
    private String status;

    getters / setters
}

Как этого добиться с помощью Spring WebClient?

1 Ответ

0 голосов
/ 31 января 2020

при условии, что второй API http://localhost:8888/api/composition/bonus/{appraisal_id} отвечает 204 Нет содержимого, если он не находит или не существует идентификатора, и, в свою очередь, если предположить, что ожидаемый ответ представляет собой список PerformanceAppraisalWithBonus (Flux), то он будет выглядеть следующим образом:

webClient

@Component
public class TestClient {


  public Flux<Appraisal> firstServiceList() {

    return WebClient.create()
            .get()
            .uri("http://demo4307830.mockable.io/first")
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToFlux(Appraisal.class);

  }

  public Mono<AppraisalBonus> firstServiceFindId(UUID uuid) {

    return WebClient.create()
            .get()
            .uri("http://demo4307830.mockable.io/"+ uuid)
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToMono(AppraisalBonus.class);

  }
}

Сервис

@Service
public class AppraisalServiceImpl {

  @Autowired
  private TestClient testClient;

  public Flux<AppraisalCombine> combineTwo() {
    return testClient.firstServiceList()
            .flatMap(appraisal -> testClient.firstServiceFindId(appraisal.getAppraisalId())
                    .flatMap(appraisalBonus -> Mono.just(AppraisalCombine.builder()
                            .appraisalId(appraisalBonus.getAppraisalId())
                            .bonusAmount(appraisalBonus.getBonusAmount())
                            .bonusPaidDate(appraisalBonus.getBonusPaidDate())
                            .employeeId(appraisalBonus.getEmployeeId())
                            .grade(appraisal.getGrade())
                            .score(appraisal.getScore())
                            .status(appraisal.getStatus())
                            .build())));

  }
}

Контроллер

@RestController
@RequestMapping("/appraisal")
public class AppraisalController {

  @Autowired
  AppraisalServiceImpl appraisalService;

  @GetMapping(value = "/get")
  public Flux<AppraisalCombine> uploadSimple() {
    return appraisalService.combineTwo();
  }
}

результат

[
    {
        "appraisalId": "ac234fbf-740c-4390-89d4-0e9753ad4d70",
        "bonusAmount": 4760.0,
        "bonusPaidDate": "2019-06-30",
        "employeeId": "emp-4623",
        "grade": "VERY_GOOD",
        "score": 94,
        "status": "NEW"
    }
]
...