gpt4 book ai didi

java - 一个 Java Play 操作中的多个 WS 调用

转载 作者:太空宇宙 更新时间:2023-11-04 14:46:04 25 4
gpt4 key购买 nike

我正在开发一个 Play 2 (v2.2.3) Java 应用程序(使用 Java 8),其任务是从两个 Web 服务获取数据并返回组合结果。

从我的第一次 WS 调用中,我得到了一个 JSON 数组对象,其中包含工作列表。现在,对于这个集合中的每一个工作,我想调用另一个 WS,它给我一些信息,比如提供该工作的公司的股票价格。毕竟,我希望我的操作能够返回这个新的“增强型”JSON 数组,其中除了每个职位列表之外,我还可以看到股票价格。

我开始将一些东西放在一起,并设法取回作业列表,但不知何故,将两个调用粘合在一起的部分无法工作/被调用。

public static Promise<Result> index() {
final Promise<WS.Response> resultPromiseJobs = WS.url("https://jobs.github.com/positions.json?description=java").get();
final Promise<Result> result = resultPromiseJobs.flatMap(response -> {
JsonNode jobListings = response.asJson();
// convert jobListings to a collection
List<Job> jobs = ...
// call map on this collection to fetch stock prices for each element
jobs.stream().map(job -> {
Promise<WS.Response> resultPromiseStock = WS.url("secondURL?someQuery=job").get()); // this also returns a promise
// so let's map it to something
// ??? what to map to and how to convert all this to a 'Result'
resultPromiseStock.map();
...
});
});
return result; // what is the correct object to return here?
}

This基本上是相同的问题,但是关于 Scala,我对 Java 解决方案感兴趣

最佳答案

从我们的聊天中我可以看到您想要映射每个 WS.ResponseJsonNode ,将为您留下 List<Promise<JsonNode>>Promise.sequence可以用来转换List<Promise<JsonNode>>Promise<List<JsonNode>> ,然后您可以将其映射到 Promise<Result> .

public static Promise<Result> index() {
final Promise<WS.Response> resultPromiseJobs = WS.url("https://jobs.github.com/positions.json?description=java").get();
final Promise<Result> result = resultPromiseJobs.flatMap(response -> {
JsonNode jobListings = response.asJson();

List<Job> jobs = ...

List<Promise<JsonNode>> jsonResultsPromise = jobs.stream().map(job -> {
Promise<WS.Response> resultPromiseStock = WS.url("secondURL?someQuery=job").get()); // this also returns a promise
// map this to the retrieved JsonNode
resultPromiseStock.map(...);
});

// Convert the list of promises into a promise of lists
Promise<List<JsonNode>> jsonResults = Promise.sequence(jsonResultsPromise);

// Now map to Promise<Result>
jsonResults.map(...);

});
return result;
}

这里的问题是,如果 Promise 之一s 无法完成,整个列表都会失败。在许多情况下,如果您需要所有结果,您可能希望发生这种情况。丢弃失败的东西很容易 Promise使用此方法从 Scala 中的列表中获取 s,但我不确定如何在没有 fold 的情况下在 Java 中执行此操作.

关于java - 一个 Java Play 操作中的多个 WS 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24369113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com