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

从属网络客户端呼叫-Spring被动响应

羊舌和安
2023-03-14

我试图做两个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-另外,刚刚找到了这个线程。他基本上说,除非你阻止第一次通话,否则就无法宣布第二次通话。是这样吗?

共有1个答案

沈凡
2023-03-14

你为什么不触发第二次呼叫,是因为你打破了我在这个答案中提到的链条(附示例)。

别再打破锁链了

// 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