我正在寻找一个解决方案来实现来自Spring-引导应用程序的GraphQL api调用,查询模式如下:
查询{
getDetailsByRefNumber(RefNumbers: “”)
{
field1,
field2,
field3
} }
有人知道如何实现这一点吗?通过以下链接之一,但未找到任何解决方案
有没有基于java的Graphql客户端可以从Java代码调用graphql服务器?
您可以使用可在以下位置获得的“图形ql-webclient-sping-boot-starter”库:
https://github . com/graph QL-Java-kickstart/graph QL-spring-webclient
<!-- https://mvnrepository.com/artifact/com.graphql-java-kickstart/graphql-webclient-spring-boot-starter -->
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-webclient-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
示例实现可以是这样的:
假设你有 MyEntity 对象:
public class MyEntity
{
String field1;
String field2;
String field3;
//getter and setters here
}
您还在“src/main/资源”文件夹下有两个图形ql查询文件:
query1.graphql:
#query1.graphql
#this query returns a list of some_detail_entity
query getDetailListByRefNumber($RefNumber: String!){
some_detail_entity(where: {RefNumber : { _eq: $RefNumber } }) {
field1
field2
field3
}
}
query2.graphql:
#query2.graphql
#this query returns a single some_detail_entity
query getDetailByRefNumber($RefNumber: String!){
some_detail_entity_by_pk(RefNumber : $RefNumber) {
field1
field2
field3
}
}
您可以使用此代码段调用 graphql 服务器进行查询
ObjectMapper objectMapper = new ObjectMapper();
WebClient webClient = WebClient.builder()
.baseUrl("https://endpoint-url-of-graphql.com")//url of graphql instance
.defaultHeader("auth-token", "some-cryptic-code-if-required")//if auth header not required, just delete this line
.build();
GraphQLWebClient graphqlClient = GraphQLWebClient.newInstance(webClient, objectMapper);
//if expecting a single entity (not array)
MyObject entity = graphqlClient.post("query2.graphql",
Map.of("RefNumber", "A7EED900-9BB4-486F-9F7C-2136E61E2278"), MyEntity.class)
.block();
//if expecting a list of entity (array)
var response = graphqlClient.post(GraphQLRequest.builder().resource("query1.graphql")
.variables(Map.of("RefNumber", "A7EED900-9BB4-486F-9F7C-2136E61E2278")).build())
.block();
List<MyEntity> entityList = response.getFirstList(MyEntity.class);