如何进行依赖的 webclient 调用

How to make dependent webclient calls

我需要进行 3 个依赖 WebClient API 调用。最后,我想要一个 FinalResponse 对象的单声道。 我需要使用第一个 API 响应中的值来调用第二个 API(这将 return 购买单声道 class。购买 class将包含 2 个成员变量

  1. 用户对象
  2. 列表 现在,对于列表中的每个值,我需要进行第三次 API 调用。然后 return 控制器的最终单声道对象。

我目前不知道如何为列表中的每个值异步调用第 3 个 API(return 由第 2 个 API 编辑)

service.getPurchasesreturns Mono<Purchase>。 service.getSimilarItems returns Mono<List<Item>>.

class Purchase{
   private List<Item> purchasedItemsList;
}

class Item {
   private int itemId;
   private int categoryId;
   private String itemName;
}
public Mono<FinalResponse> getEndResults(UserRequest userRequest) {
        Mono<User> response1 = service.getUserResponse(userRequest);
        return response1.flatMap(response -> {
           int userId = response.getUserId();
           FinalResponse finalResponse = new FinalResponse();
           List<AllItems> itemList = new LinkedList<>();
           return service.getPurchase(userRequest, userId)
                    .map(purchasedItem -> {
                        val.getPurchasedItemsList().forEach(oneItem -> {      // please help me how to go about from here
                              service.getSimilarItemsInCategory(userRequest, userId, oneItem.getCategoryId)
                              .map(similarItem -> { 
                                AllItems allItem = new AllItems();     
                                allItem.setPurchasedItem(oneItem);
                                allItem.setSimilarItem(similarItem);
                                itemList.add(allItem);
                              });
                        });
                finalResponse.setResults(itemList);
                 return finalResponse;
                    });
        });
    }



class FinalResponse {
    private User user;
    private List<AllItems> results;
}
class AllItems {
    private Item purchasedItem;
    private List<Item> similarItem;
}

基本上我需要的最终响应看起来像

{
 "users":{//UserObject//},
 "results": [
     {
         "purchasedItem": {// Purschased Item 1},
         "similarItems": [
             {//Similar Item 1},
             {//Similar Item 2}
          ]
     },
     {
         "purchasedItem": {// Purschased Item 1},
         "similarItems": [
             {//Similar Item 1},
             {//Similar Item 2}
          ]
     }
 ]

}

根据 Toerktumlare 的评论:如果 WebClient 调用 return 简单值或列表的 Monos 或 Fluxes,这可能相当简单。

您可以使用 flatMapMany()flatMapIterable()

这个简化的例子怎么样?


    public Mono<FinalResponse> getEndResults(UserRequest userRequest) {
        Mono<User> userResponse = service.getUserResponse(userRequest);
        return userResponse.flatMap(response -> {
                    int userId = response.getUserId();
                    return service.getPurchase(userRequest, userId)
                            .map(Purchase::getPurchasedItemsList)
                            .flatMapIterable(purchasedItems -> purchasedItems)
                            .flatMap(oneItem -> getSimilarItemInCategory(userRequest, userId, oneItem))
                            .collectList();
                })
                .map(itemList -> {
                    FinalResponse finalResponse = new FinalResponse();
                    finalResponse.setResults(itemList);
                    return finalResponse;
                });
    }

    public Mono<AllItems> getSimilarItemInCategory(UserRequest userRequest, int userId, Item oneItem) {
        return service.getSimilarItemsInCategory(userRequest, userId, oneItem.getCategoryId())
                .map(similarItem -> {
                    AllItems allItem = new AllItems();
                    allItem.setPurchasedItem(oneItem);
                    allItem.setSimilarItem(similarItem);
                    return allItem;
                });
    }