如何进行依赖的 webclient 调用
How to make dependent webclient calls
我需要进行 3 个依赖 WebClient API 调用。最后,我想要一个 FinalResponse 对象的单声道。
我需要使用第一个 API 响应中的值来调用第二个 API(这将 return 购买单声道 class。购买 class将包含 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;
});
}
我需要进行 3 个依赖 WebClient API 调用。最后,我想要一个 FinalResponse 对象的单声道。 我需要使用第一个 API 响应中的值来调用第二个 API(这将 return 购买单声道 class。购买 class将包含 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;
});
}