当前位置: 首页 > 知识库问答 >
问题:

如何进行依赖的WebClient调用

韦辰钊
2023-03-14

我需要进行3个相关的WebClient API调用。最后,我想要一个最终响应对象的Mono。我需要使用第一个API响应中的值来调用第二个API(它将返回Purchase类的Mono)。Purchase类将包含2个成员变量

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

目前,我一直在研究如何为列表中的每个值(由第二个API返回)异步调用第三个API

service.get购买返回Mono

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}
          ]
     }
 ]

}

共有1个答案

郝哲茂
2023-03-14

下面是Toerktumlare的评论:如果WebClient调用返回Monos或简单值或列表的流量,这可能相当简单。

您可以使用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;
                });
    }

 类似资料:
  • RestTemplate文档中的Spring注意: 注意:从5.0开始,这个类处于维护模式,只接受微小的更改请求和bug。请考虑使用org.springframework.web.reactive.client.WebClient,它具有更现代的API,支持同步、异步和流场景。 https://docs.spring.io/spring-framework/docs/current/javadoc

  • 我搜索了许多网站和文档,但异步调用使用的代码相同。但不确定为什么它不起作用。如果我错过了什么,有人能帮我吗?

  • 我在尝试使用“create”创建WebClient实例的线路上收到一个NoClassDefFoundError。尝试了builder(),但仍然是一样的。 请告诉我添加的依赖项有什么问题,以及如何解决这个问题。 我添加的依赖项是 StackTrace:

  • 第一次尝试这样做,所以不确定我在做什么或如何设置它。 我需要调试我在应用程序中使用的库。最初,我把它安装在中。这对于调试来说不太好,我遇到了这个答案,描述了如果你需要对它进行修改,如何处理依赖项: https://stackoverflow.com/a/13302095/3123109 所以现在我正在做,它将回购的副本放入我的。 我的印象是这样做后它会“起作用”。当然没那么简单... 我试过的 >

  • 我希望从spring reactive WebClient进行SOAP调用。我找不到任何文件。想知道会有什么方法。现在我在想 null 缺点和其他方法是什么?

  • 我希望以并行方式并使用无阻塞线程(如Python中的eventlet) 我想用这样的线程创建单独的共享工作线程池,以便不为每个传入请求创建一个共享工作线程池。 以下是有关调度器的文档http://projectreactor.io/docs/core/release/reference/#schedulers 但是我不能为每个请求创建新的工作池,池中的线程仍然以阻塞的方式工作。 如果有人用Spri