Spring Boot Sping Boot 中的多个graphQL客户端端点

3htmauhk  于 2022-11-05  发布在  Spring
关注(0)|答案(2)|浏览(291)

在我的项目中,我需要从多个graphql端点获取数据。我在www.example.com文件中定义了一个端点application.properties,如下所示:graphql.client.url=https://api.foo.com/graphql-1并在代码中提取数据:

public Foo getFooByid(String id) throws Exception {
    final GraphQLRequest request =
        GraphQLRequest.builder()
            .query(orgByIdQuery)
            .variables(Map.of("id", id))
            .build();

    final GraphQLResponse response = graphQLWebClient.post(request).block();
    response.validateNoErrors();

    return response.get("Foo", Foo.class);

  }

因此,从www.example.com文件中获取客户端url是一个很好的方法application.properties。现在,如何定义第二个客户端url https://api.foo.com/graphql-2并在代码中使用它呢?gql的依赖关系:

<dependency>
      <groupId>com.graphql-java-kickstart</groupId>
      <artifactId>graphql-webclient-spring-boot-starter</artifactId>
      <version>1.0.0</version>
    </dependency>
xuo3flqw

xuo3flqw1#

一旦定义了所有需要的URL(将@Value绑定到属性文件),就应该创建一个HttpGraphQlClientBean,然后可以针对每个请求对其进行修改:

@Bean
HttpGraphQlClient graphQlClient(){
    return HttpGraphQlClient.builder()
            .url(firstUrl)
            .build();
}

在你的另一个组件里,你提出了你的第一个请求...

graphQlClient
            .documentName(orgByIdQuery)
            .retrieve("org") 
            ... //etc

然后,您可以根据需要对其进行多次修改

graphQlClient
            .mutate()
            .header("Authorization","Basic anVsaW86YHIJ0ZUJBMjAyMg==") //many different customizations are allowed
            .url(anotherUrl)
            .build()
            .documentName(orgByIdQuery)
            .retrieve("org") 
            ... //etc

希望能有所帮助!

1cklez4t

1cklez4t2#

Lib似乎允许通过属性为1个客户端进行配置。其他客户端似乎必须通过编程方式创建。
然后放入spring上下文中或在类内部使用。请参见WebClientAutoConfiguration,它为生成的WebClient提供WebClient.Builder和定制器。可能可以重用WebClient.Builder,它已经在spring上下文中并设置另一个baseUrl,但创建新的构建器并配置它似乎是更好的方法。可能的示例:

@Component
class GqlService(
    objectMapper: ObjectMapper,
    customizerProvider: ObjectProvider<WebClientCustomizer>,
    @Value("\$graphql.client2.url") baseUrl: String
) {
    private val secondGqlClient: GraphQLWebClient

    init {
        val builder = WebClient.builder()
        customizerProvider.orderedStream().forEach { customizer -> customizer.customize(builder) }
        builder.baseUrl(baseUrl)
        secondGqlClient = GraphQLWebClient.newInstance(builder.build(), objectMapper)
    }
}

相关问题