Java 通過API操作GraphQL
GraphQL可以通過Java的API來實現數據的查詢,通過特定的SDL查詢語句,獲取特定的查詢數據。相當於後端作為提供數據源的”數據庫”,前端根據定義的SDL語句查詢需要的數據,將查詢數據的控制權交給前端,提高後端接口的通用性和靈活性
引入依賴
<dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java</artifactId> <version>11.0</version> </dependency>
需要配置第三方的maven倉庫才可以下載這個jar包,要不然從中央倉庫無法下載。
官方網站,在快速開始中有需要配置的倉庫www.graphql-java.com
Java中使用GraphQL的API
根據定義的簡單查詢語法通過Java的API查詢數據
無參數簡單查詢
通過定義的查詢格式,通過GraphQL對象實現查詢,需要先構建響應的數據對象和構建響應的數據
/** * 簡單展示 GraphQL的查詢,以及通過JavaAPI響應數據 */ public class GraphQLSimpleDemo { public static void main(String[] args) { // 定義數據響應對象 GraphQLObjectType userType = createGraphQLObjectType(); // 根據定義的數據響應對象構建響應的數據 GraphQLFieldDefinition userDefinition = createGraphQLFieldDefinition(userType); // 創建查詢響應 GraphQLSchema graphQLSchema = createGraphQLSchema(userDefinition); GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build(); // 查詢語句 String graph1 = "{User{id, name}}"; // 查詢多個字段 String graph2 = "{User{id, name, age}}"; // 執行查詢 ExecutionResult execute = graphQL.execute(graph1); // 獲取結果 System.out.println(execute.toSpecification()); // 執行查詢 ExecutionResult execute2 = graphQL.execute(graph2); // 獲取結果 System.out.println(execute2.toSpecification()); } // 創建GraphQLSchema public static GraphQLSchema createGraphQLSchema(GraphQLFieldDefinition userDefinition) { GraphQLObjectType userQuery = GraphQLObjectType.newObject() .name("userQuery") .field(userDefinition) .build(); return GraphQLSchema.newSchema().query(userQuery).build(); } /** * 創建GraphQLFieldDefinition對象 * * 根據定義的查詢對象做真正的查詢,返回查詢數據 * * 這裡使用靜態對象構建數據,如果是查詢數據,可以在這裡進行做查詢 * */ public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) { return GraphQLFieldDefinition.newFieldDefinition() .name("User") .type(userType) // 靜態數據 .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(); } }
帶參數簡單查詢
自定義的查詢規范中,可以通過定義參數實現查詢,在API中可以獲取到參數通過參數實現自定義查詢,參數需要按照規范定義
/** * 簡單展示 GraphQL的查詢,以及通過JavaAPI響應數據 * * 傳遞參數進行查詢 */ 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()); } // 創建GraphQLSchema public static GraphQLSchema createGraphQLSchema(GraphQLFieldDefinition userDefinition) { GraphQLObjectType userQuery = GraphQLObjectType.newObject() .name("userQuery") .field(userDefinition) .build(); return GraphQLSchema.newSchema().query(userQuery).build(); } /** * 創建GraphQLFieldDefinition對象 * * 根據定義的查詢對象做真正的查詢,返回查詢數據 * * 這裡使用靜態對象構建數據,如果是查詢數據,可以在這裡進行做查詢 * */ public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) { return GraphQLFieldDefinition.newFieldDefinition() .name("User") .type(userType) // 設置參數查詢數據 .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的簡單示例,一個是沒有參數的查詢,一個是通過傳遞參數的查詢,可以看出來,GraphQL
的在查詢數據的控制權交給定義的查詢語句,GraphQL
構建的數據作為基礎的數據源,如果使用GraphQL定義的接口具有靈活性和通用性,但是可以看出來,在使用方面也是較為復雜,並且接口多和較為復雜的情況下,相對於Restful
來講,較為復雜,兩種方式各有優缺點
下一篇,將簡單示例在Springboot中使用GraphQL定義接口~~
以上就是Java 通過API操作GraphQL的詳細內容,更多關於Java 操作GraphQL的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 如何利用反射生成 MyBatisPlus中QueryWrapper動態條件
- TypeScript 的條件類型使用示例詳解
- Java如何獲取屬性的註釋信息詳解
- Java開發反射機制的實戰經驗總結
- Java深入分析講解反射機制