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

Spring启动中的两个依赖Web客户端api调用

楚意
2023-03-14

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

>

  • 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"
         }
     ]
    

    第二个 api 调用在 (http://localhost:8080/2) http://localhost:8080/projectId 此结果,如下所示

    [

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

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

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

    谢谢你的帮助。提前感谢

  • 共有1个答案

    端木令
    2023-03-14

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

    • 获取项目
      • 对于每个项目
        • 通过projectId并获得团队成员

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

        getAllProjects和getTeamMembers

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

        @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();
                    }));
        
            }
        }
        

        请注意,元组是

        在这里,您所做的就是使用单声道。zip并将两件事传递给它

        • 项目
        • 团队成员列表

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

        希望这有帮助。

        --更新--下面是更新代码

        Config for webclient

        @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();
            }
        
        }
        

     类似资料:
    • 我正在构建一个用于从云存储获取加密机密的库(在Scala中,使用Java客户端)。我正在使用以下google库: 一切都在本地正常工作,但是当我试图在Dataproc中运行我的代码时,我得到了以下错误: 我的代码中有问题的行是: 我在文档中看到,一些google库在Dataproc上可用(我使用的是图像版本为1.2.15的Spark集群)。但就我所见,GoogleAPI客户端的可传递依赖项与我在本

    • 启动客户端 需要启动一个以太坊客户端,当然如果你已经启动了就不需要再次启动。 如果是geth的话这么启动: $ geth --rpcapi personal,db,eth,net,web3 --rpc --rinkeby 如果是Parity启动: $ parity --chain testnet 如果使用Infura客户端提供的免费的云端服务,这么启动: Web3j web3 = Web3j.

    • 客户端跟服务端基本一样,也支持Web Host和Generic host 调用AddClient方法启用客户端 public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(Compatibility

    • 当我尝试运行Springboot eureka客户端时,我发现以下运行时异常 组织。springframework。豆。工厂BeanDefinitionStoreException:未能加载bean类:;嵌套的异常是java。lang.IllegalStateException:找到注解@EnableDiscoveryClient,但没有实现。你忘了带开胃菜吗?

    • 我正试图了解OAuth2和SpringSecurityOAuth,尤其是OAuth提供者服务。我正在尝试实现以下内容: OAuth提供商 资源服务器(应使用OAuth提供程序(1)保护的RESTful Web服务) Web客户端(使用Spring Security性保护的Web客户端应用程序,但应使用OAuth提供程序(1)对用户进行身份验证 本机移动客户端(Android和iOS)也应该使用OA

    • 我有一个Maven多模块项目,在主pom中将一些旧版本的Spring Boot依赖项设置为父项。xml。所有子模块都从这个主pom继承Spring Boot依赖项。xml。 这很好,但是在一个新的子模块(也是多模块)中,我想使用最新的Spring引导版本,而不改变项目中正在使用的版本(以及所有依赖项)。 有没有办法巧妙地覆盖从父版本派生的Spring引导版本(及其所有依赖项),并在子模块中使用不同