Java 通過API操作GraphQL
GraphQL可以通過Java的API來實現(xiàn)數(shù)據(jù)的查詢,通過特定的SDL查詢語句,獲取特定的查詢數(shù)據(jù)。相當于后端作為提供數(shù)據(jù)源的"數(shù)據(jù)庫",前端根據(jù)定義的SDL語句查詢需要的數(shù)據(jù),將查詢數(shù)據(jù)的控制權交給前端,提高后端接口的通用性和靈活性
引入依賴
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>11.0</version>
</dependency>
需要配置第三方的maven倉庫才可以下載這個jar包,要不然從中央倉庫無法下載。
官方網站,在快速開始中有需要配置的倉庫www.graphql-java.com
Java中使用GraphQL的API
根據(jù)定義的簡單查詢語法通過Java的API查詢數(shù)據(jù)
無參數(shù)簡單查詢
通過定義的查詢格式,通過GraphQL對象實現(xiàn)查詢,需要先構建響應的數(shù)據(jù)對象和構建響應的數(shù)據(jù)
/**
* 簡單展示 GraphQL的查詢,以及通過JavaAPI響應數(shù)據(jù)
*/
public class GraphQLSimpleDemo {
public static void main(String[] args) {
// 定義數(shù)據(jù)響應對象
GraphQLObjectType userType = createGraphQLObjectType();
// 根據(jù)定義的數(shù)據(jù)響應對象構建響應的數(shù)據(jù)
GraphQLFieldDefinition userDefinition = createGraphQLFieldDefinition(userType);
// 創(chuàng)建查詢響應
GraphQLSchema graphQLSchema = createGraphQLSchema(userDefinition);
GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();
// 查詢語句
String graph1 = "{User{id, name}}";
// 查詢多個字段
String graph2 = "{User{id, name, age}}";
// 執(zhí)行查詢
ExecutionResult execute = graphQL.execute(graph1);
// 獲取結果
System.out.println(execute.toSpecification());
// 執(zhí)行查詢
ExecutionResult execute2 = graphQL.execute(graph2);
// 獲取結果
System.out.println(execute2.toSpecification());
}
// 創(chuàng)建GraphQLSchema
public static GraphQLSchema createGraphQLSchema(GraphQLFieldDefinition userDefinition) {
GraphQLObjectType userQuery = GraphQLObjectType.newObject()
.name("userQuery")
.field(userDefinition)
.build();
return GraphQLSchema.newSchema().query(userQuery).build();
}
/**
* 創(chuàng)建GraphQLFieldDefinition對象
*
* 根據(jù)定義的查詢對象做真正的查詢,返回查詢數(shù)據(jù)
*
* 這里使用靜態(tài)對象構建數(shù)據(jù),如果是查詢數(shù)據(jù),可以在這里進行做查詢
*
*/
public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) {
return GraphQLFieldDefinition.newFieldDefinition()
.name("User")
.type(userType)
// 靜態(tài)數(shù)據(jù)
.dataFetcher(new StaticDataFetcher(new User(1L, "測試", 10)))
.build();
}
/**
* 定義GraphQLObjectType對象
* 該對象是用來做查詢響應對象的名稱和查詢的字段的定義
*/
public static GraphQLObjectType createGraphQLObjectType() {
return GraphQLObjectType.newObject()
.name("User")
.field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong))
.field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString))
.field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt))
.build();
}
}
帶參數(shù)簡單查詢
自定義的查詢規(guī)范中,可以通過定義參數(shù)實現(xiàn)查詢,在API中可以獲取到參數(shù)通過參數(shù)實現(xiàn)自定義查詢,參數(shù)需要按照規(guī)范定義
/**
* 簡單展示 GraphQL的查詢,以及通過JavaAPI響應數(shù)據(jù)
*
* 傳遞參數(shù)進行查詢
*/
public class GraphQLSimpleDemoWithArgs {
public static void main(String[] args) {
GraphQLObjectType userType = createGraphQLObjectType();
GraphQLFieldDefinition userDefinition = createGraphQLFieldDefinition(userType);
GraphQLSchema graphQLSchema = createGraphQLSchema(userDefinition);
GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();
String graph3 = "{User(id:1){id, name, age}}";
ExecutionResult execute3 = graphQL.execute(graph3);
// 獲取結果
System.out.println(execute3.toSpecification());
}
// 創(chuàng)建GraphQLSchema
public static GraphQLSchema createGraphQLSchema(GraphQLFieldDefinition userDefinition) {
GraphQLObjectType userQuery = GraphQLObjectType.newObject()
.name("userQuery")
.field(userDefinition)
.build();
return GraphQLSchema.newSchema().query(userQuery).build();
}
/**
* 創(chuàng)建GraphQLFieldDefinition對象
*
* 根據(jù)定義的查詢對象做真正的查詢,返回查詢數(shù)據(jù)
*
* 這里使用靜態(tài)對象構建數(shù)據(jù),如果是查詢數(shù)據(jù),可以在這里進行做查詢
*
*/
public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) {
return GraphQLFieldDefinition.newFieldDefinition()
.name("User")
.type(userType)
// 設置參數(shù)查詢數(shù)據(jù)
.argument(GraphQLArgument.newArgument().name("id").type(Scalars.GraphQLLong).build())
.dataFetcher(environment -> {
Long id = environment.getArgument("id");
return new User(id, "name" + id, id.intValue());
})
.build();
}
/**
* 定義GraphQLObjectType對象
* 該對象是用來做查詢響應對象的名稱和查詢的字段的定義
*/
public static GraphQLObjectType createGraphQLObjectType() {
return GraphQLObjectType.newObject()
.name("User")
.field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong))
.field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString))
.field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt))
.build();
}
}
上面兩個關于GraphQL的簡單示例,一個是沒有參數(shù)的查詢,一個是通過傳遞參數(shù)的查詢,可以看出來,GraphQL的在查詢數(shù)據(jù)的控制權交給定義的查詢語句,GraphQL構建的數(shù)據(jù)作為基礎的數(shù)據(jù)源,如果使用GraphQL定義的接口具有靈活性和通用性,但是可以看出來,在使用方面也是較為復雜,并且接口多和較為復雜的情況下,相對于Restful來講,較為復雜,兩種方式各有優(yōu)缺點
下一篇,將簡單示例在Springboot中使用GraphQL定義接口~~
以上就是Java 通過API操作GraphQL的詳細內容,更多關于Java 操作GraphQL的資料請關注腳本之家其它相關文章!
相關文章
springboot如何配置上傳文件的maxRequestSize
這篇文章主要介紹了springboot如何配置上傳文件的maxRequestSize,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法
這篇文章主要介紹了java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法的相關資料,需要的朋友可以參考下2016-11-11
SpringBoot中定時任務@Scheduled注解的使用解讀
這篇文章主要介紹了SpringBoot中定時任務@Scheduled注解的使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
使用SpringBoot 配置Oracle和H2雙數(shù)據(jù)源及問題
這篇文章主要介紹了使用SpringBoot 配置Oracle和H2雙數(shù)據(jù)源及問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java中注解@JsonFormat與@DateTimeFormat的使用
從數(shù)據(jù)庫獲取時間傳到前端進行展示的時候,我們有時候可能無法得到一個滿意的時間格式的時間日期,本文主要介紹了Java中注解@JsonFormat與@DateTimeFormat的使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08

