【问题标题】:Two Dependent web client api calls in spring bootspring boot 中的两个依赖 web 客户端 api 调用
【发布时间】:2022-01-06 04:26:55
【问题描述】:

我有两个 api 调用,我需要根据第一个 api 调用结果获得第二个 api 调用结果,然后我需要合并两个 api 调用响应让我在这里写

  1. API 调用:https://localhost:8080/projects 这是第一次 api 调用,结果如下所示

    [ {

     "projectId" : 2,
     "projectName" : "Hello",
     "projectDesc" : "Demo project"
     },
     {
    
     "projectId" : 3,
     "projectName" : "Hello123",
     "projectDesc" : "Demo project series"
     },
     {
        "projectId" : 4,
         "projectName" : "Hello456",
         "projectDesc" : "Demo project repeat"
         }
     ]
    
  2. 第二次 api 调用 http://localhost:8080/projectId 在意义上(http://localhost:8080/2)这个结果如下

[

{
"teamMember" : "abc",
"teamMemberRole": "Manager"
}
]

现在我需要合并两个响应,如何使用 webclient 来实现这一点

[
{

"projectId" : 2,
"projectName" : "Hello",
"projectDesc" : "Demo project",
"teamMember" : "abc",
"teamMemberRole" : "Manager"
}
]

感谢您的帮助。提前致谢

【问题讨论】:

标签: spring-boot spring-webflux spring-webclient


【解决方案1】:

我想我理解你的问题,而且它很常见。您想要做的关键事情是创建一个响应通量,其中每个元素都与子响应通量合并。即。

  • 获取项目
    • 对于每个项目
      • 传递 projectId 并获取团队成员
    • 与团队成员合并/映射每个项目
  • 返回带有团队成员数据的项目流量

假设您有一个服务类可以获取给定项目的项目和团队成员的数据。

获取所有项目 获取团队成员

您可以使用它来编写名为“getProjectsWithTeamMembers”的结果函数

@Component
@Slf4j
public class ProjectHandler {

    @Autowired
    private WebClient webClient;

    public Flux<Project> getAllProjects() {

        return webClient
            .get()
            .uri("projects")
            .retrieve()
            .bodyToFlux(Project.class);
    }

    public Mono<List<TeamMember>> getTeamMembers(Integer id) {
         ParameterizedTypeReference<List<TeamMember>> listParameterizedTypeReference =
            new ParameterizedTypeReference<List<TeamMember>>() {
            };
        return webClient.get()
                .uri("" + id)
                .retrieve()
                .onStatus(HttpStatus::is4xxClientError, clientResponse ->
                    Mono.empty()
                )
                .bodyToMono(listParameterizedTypeReference)
                .log();
    }

    public Flux<Project> getProjectsWithTeamMembers() {
        return getAllProjects()
                .flatMap(project ->
                        Mono.zip(Mono.just(project),
                            getTeamMembers(project.getProjectId()).defaultIfEmpty(new ArrayList<TeamMember>()))
                .map(tuple -> {
                    log.info("data" + tuple.getT2().size());
                    return 
 Project.builder().projectId(tuple.getT1().getProjectId())
                        .projectName(tuple.getT1().getProjectName())
                        .projectDesc(tuple.getT1().getProjectDesc())
                        .teamMemberList(tuple.getT2()).build();
            }));

    }
}

请注意元组属于

元组>

您正在做的是使用 Mono.zip 并向其传递两件事

  • 项目
  • 团队成员名单

Mono.zip 将结合它并创建项目和团队成员的 Tuple2,您可以使用它来编写映射代码以构建完整的响应。

希望这会有所帮助。

-- 更新-- 以下是更新代码

网络客户端配置

@Configuration
public class AppConfig {

    @Bean
    public WebClient webClient(WebClient.Builder webClientBuilder) {
        return webClientBuilder
                .baseUrl("http://localhost:3000/")
                .defaultHeader(HttpHeaders.CONTENT_TYPE,  "application/json")
                .build();
    }
}

模型类

 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
 public class Project {
    private Integer projectId;
    private String projectName;
    private String projectDesc;
    private List<TeamMember> teamMemberList;

 }

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TeamMember {
    private String teamMember;
    private String teamMemberRole;
}

最后是其余的控制器

@RestController
@Slf4j
public class ProjectController {

    @Autowired
    private ProjectHandler projectHandler;

    @GetMapping(PROJECT_ENDPOINT_V1)
    public Flux<Project> getAllProjects() {
        return projectHandler.getProjectsWithTeamMembers();
    }

}

【讨论】:

  • 谢谢@Harry,我已经按照你的步骤操作了,但是发生了什么响应值没有与我的本地java类映射,在这种情况下,它正在为项目类分配任何值,我没有知道哪里出了问题,就像它给出的值是 null
  • 如果可能的话,分享你的代码或链接一个要点
  • 我尝试通过使用示例响应来构建类似的东西:github.com/harryalto/reactive-springwebflux/tree/master/src/…。我能够得到我想要的回应。你可以试试这个并告诉我
  • @NarayanaRaoKancharana :我更新了代码。你能检查一下你是否还有问题。您还可以分享您的模型/本地 java 类是如何定义的。
  • 当然@Harry,谢谢
猜你喜欢
  • 2020-05-17
  • 1970-01-01
  • 2021-10-22
  • 2018-01-24
  • 1970-01-01
  • 2017-06-17
  • 2018-04-08
  • 2018-08-22
  • 2015-08-26
相关资源
最近更新 更多