我试图做两个API调用,第二个API调用依赖于第一个API响应。下面这段代码给出了第一次weblient调用的响应。在这里,我没有得到来自第二个API调用的响应。在日志中,我可以看到对第二个网络客户端调用的请求甚至不是用onSubcribe()启动的。你能告诉我我做错了什么吗?
@Autowired
Issue issue;
List issueList = new ArrayList<>();
public Mono<Response> getResponse(Request request) {
return webClient.post()
.uri("myURI")
.body(Mono.just(request),Request.class)
.retrieve()
.bodyToMono(Response.class)
.flatMap(resp->{
resp.getIssues().stream()
.forEach(issueTemp -> {
issue = issueTemp;
webClient.get()
.uri("mySecondURI" + issueTemp.getId())
.retrieve()
.bodyToMono(Issue.class)
.flatMap(issueTemp2-> {
issue.setSummary(issueTemp2.getSummary());
return Mono.just(issue);
}).log();
issueList.add(issue);
});
Response responseFinal = new Response();
responseFinal.setIssues(issueList);
return Mono.just(responseFinal);
}).log();
}
更新2:
我已经将我的代码更改为Functions,并使用Flux而不是流迭代。我现在面临的是,所有的迭代都被过滤掉do秒dCall方法。请参考我的意见do秒dCall方法。由于其原因,第二次调用不被触发。如果我不应用过滤器,会有像“问题/空”这样的请求触发,这也会导致我的服务下降。
public Mono<Response> getResponse(Request request) {
return webClient.post()
.uri("myURI")
.body(Mono.just(request),Request.class)
.retrieve()
.bodyToMono(Response.class)
.flatMap(r->
doSecondCall(r).flatMap(issueList->{
r.setIssues(issueList);
return Mono.just(r);
})
);
}
public Mono<Issue> doSecondCall(Response r) {
return Flux.fromIterable(r.getIssues())
.filter(rf->rf.getId()!=null) //everything gets filtered out
.flatMap(issue->getSummary(issue.getId()))
.collectList();
}
public Mono<Issue> getSummary(Response r) {
return webClient.get()
.uri("issue/"+id)
.retrieve()
.bodyToMono(Issue.class).log();
}
[使用WebFlux的反应式编程如何处理依赖的外部api调用]@Thomas-另外,刚刚找到了这个线程。他基本上说,除非你阻止第一次通话,否则就无法宣布第二次通话。是这样吗?
你为什么不触发第二次呼叫,是因为你打破了我在这个答案中提到的链条(附示例)。
别再打破锁链了
// here...
.forEach(issueTemp -> {
issue = issueTemp; // and this is just silly? why?
webClient.get() // Here you are calling the webClient but ignoring the return value, so you are breaking the chain.
.uri("mySecondURI" + issueTemp.getId())
.retrieve()
.bodyToMono(Issue.class)
.flatMap(issueTemp2-> {
issue.setSummary(issueTemp2.getSummary());
return Mono.just(issue); // Return here but you are ignoring this return value
}).log();
issueList.add(issue);
});
你应该使用更多的函数来划分你的代码。通过编写函数使其成为一种习惯,并且总是从返回语句开始。你的代码很难读。
我认为你应该使用通量而不是迭代流。
// something like the following i'm writing by free hand without IDE
// i have no idea what your logic looks like but you should get the point.
Flux.fromIterable(response.getIssues())
.flatMap(issue -> {
return getIssue(issue.getId())
.flatMap(response -> {
return issue.setSummary(reponse.getSummary());
});
}).collectList();
我是RXJava的新手。在一个场景中,我希望调用第一个登录webservice(),如果成功,则希望调用另一个webservice()以获取用户信息。
我使用客户机对一个API进行REST调用,该API返回mulipart中的一个Json和一个PDF文件作为响应的第一和第二部分。 使用上面的客户端解析这个多部分响应的正确方法是什么?
正如twilio所说的同时拨号 您可以在动词中使用几个和名词来同时拨打多个电话号码和客户端。第一个接听电话的人将与呼叫者连接,而其余的呼叫尝试将被挂断。 我实现这个功能与描述相同,但是当有人拨打我的twilio号码时,我传递了上面的twiml响应,并且每个客户端都收到传入呼叫,但是当所有客户端之一通过.accept()方法选择呼叫时,没有任何反应,并且呼叫不断为所有客户端响铃。 但是,如果只有一个
我是 Rest Web 服务的新手。我已经创建了一个泽西岛客户端,能够拨打GET电话。现在我无法理解如何使用相同的客户端代码进行其他 POST 调用。我需要更改方法发布以及后续调用的参数以及 URI。以下是我想到的问题: 我是否应该创建一个单例类并获取客户端对象,并且对于每次调用,我都需要重复以下行。 WebResource WebResource=客户端.resource(“http://loc
是否有一个gradle插件或任何其他方法调用hiberNate工具hbm2ddl任务来从注释的类生成数据库模式,而不必列出一些配置文件中的所有实体(@Entity),但在类路径中发现它们? 最好是针对Hibernate5,但Hibernate4也可以。
当我使用jsonObject请求进行网络调用时。我没有收到任何答复。我总是收到请求的HTTP响应= 当请求缓慢时,Android截击双发: 来源1,来源2,来源3