在此之前需要簡單了解GraphQL的基本知識,可通過以下來源進行學習
GraphQL官方中文網站 :https://graphql.cn
GraphQL-java 官網: https://www.graphql-java.com
使用GraphQL需要
定義對象模型
定義查詢類型
定義查詢操作 schema
#對應的User定義如下 schema { #定義查詢 query: UserQuery } type UserQuery { #定義查詢類型 user(): User #指定對象以及參數類型 } type User { #定義對象 id: Long! #!表示非空 name:String age:Int }
java使用GraphQL需要引入GraphQL-java的依賴
<!-- The dependence of graphql-java --> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java</artifactId> <version>11.0</version> </dependency>
對應的User
public class User { private int age; private long id; private String name; public User(int age, long id, String name) { this.age = age; this.id = id; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
操作靜態數據
import clc.bean.User; import graphql.ExecutionResult; import graphql.GraphQL; import graphql.Scalars; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLSchema; import graphql.schema.StaticDataFetcher; /** * ClassName: GraphQLDemo<br/> * Description: <br/> * date: 2019/6/28 10:40 AM<br/> * * @author chengluchao * @since JDK 1.8 */ public class GraphQLDemo { public static void main(String[] args) { //定義對象 GraphQLObjectType userObjectType = GraphQLObjectType.newObject() .name("User") .field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong)) .field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt)) .field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString)) .build(); //user : User 指定對象及參數類型 GraphQLFieldDefinition userFileldDefinition = GraphQLFieldDefinition.newFieldDefinition() .name("user") .type(userObjectType) //靜態數據 .dataFetcher(new StaticDataFetcher(new User(25, 2, "CLC"))) .build(); //type UserQuery 定義查詢類型 GraphQLObjectType userQueryObjectType = GraphQLObjectType.newObject() .name("UserQuery") .field(userFileldDefinition) .build(); //Schema 定義查詢 GraphQLSchema qlSchema = GraphQLSchema.newSchema().query(userQueryObjectType).build(); GraphQL graphQL = GraphQL.newGraphQL(qlSchema).build(); String query = "{user{id,name,age}}"; ExecutionResult result = graphQL.execute(query); System.out.println(result.toSpecification()); } }
操作動態數據,數據源可以是數據庫,緩存或者是其他服務,
此例通過動態傳遞id獲取user數據,模擬實現動態數據
import clc.bean.User; import graphql.ExecutionResult; import graphql.GraphQL; import graphql.Scalars; import graphql.schema.GraphQLArgument; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLSchema; /** * ClassName: GraphQLDemo<br/> * Description: <br/> * date: 2019/6/28 10:40 AM<br/> * * @author chengluchao * @since JDK 1.8 */ public class GraphQLDemo2 { public static void main(String[] args) { //定義對象 GraphQLObjectType userObjectType = GraphQLObjectType.newObject() .name("User") .field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong)) .field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt)) .field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString)) .build(); //user : User 指定對象及參數類型 GraphQLFieldDefinition userFileldDefinition = GraphQLFieldDefinition.newFieldDefinition() .name("user") .type(userObjectType) .argument(GraphQLArgument.newArgument().name("id").type(Scalars.GraphQLLong).build()) //動態數據 .dataFetcher(environment -> { Long id = environment.getArgument("id"); //查庫或者調用其他服務 return new User(20, id, "模擬用戶1"); }) .build(); //type UserQuery 定義查詢類型 GraphQLObjectType userQueryObjectType = GraphQLObjectType.newObject() .name("UserQuery") .field(userFileldDefinition) .build(); //Schema 定義查詢 GraphQLSchema qlSchema = GraphQLSchema.newSchema().query(userQueryObjectType).build(); GraphQL graphQL = GraphQL.newGraphQL(qlSchema).build(); String query = "{user(id:15){id,name,age}}"; ExecutionResult result = graphQL.execute(query); System.out.println(result.toSpecification()); } }
以上兩個例子都是通過GraphQLObjectType的field等方法來定義模型,除此之外還可以通過SDL文件來生成模型
在resource目錄下創建user.graphqls文件
#對應的User定義如下 schema { #定義查詢 query: UserQuery } type UserQuery { #定義查詢類型 user(id:Long) : User #指定對象以及參數類型 } type User { #定義對象 id: Long! #!表示非空 name:String age:Int }
然后程序讀取此文件即可解析成模型;
在此之前需要添加一個依賴包用於讀取文件
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
詳情如下:
import clc.bean.User; import graphql.ExecutionResult; import graphql.GraphQL; import graphql.schema.GraphQLSchema; import graphql.schema.idl.RuntimeWiring; import graphql.schema.idl.SchemaGenerator; import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeDefinitionRegistry; import org.apache.commons.io.IOUtils; /** * ClassName: GraphQLSDLDemo<br/> * Description: <br/> * date: 2019/6/28 11:19 AM<br/> * * @author chengluchao * @since JDK 1.8 */ public class GraphQLSDLDemo { public static void main(String[] args) throws Exception { //讀取graphqls文件 String fileName = "user.graphqls"; String fileContent = IOUtils.toString(GraphQLSDLDemo.class.getClassLoader().getResource(fileName), "UTF-8"); //解析文件 TypeDefinitionRegistry typeDefinitionRegistry = new SchemaParser().parse(fileContent); RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring() .type("UserQuery", builder -> builder.dataFetcher("user", environment -> { Long id = environment.getArgument("id"); return new User(18, id, "user0" + id); }) ) .build(); GraphQLSchema graphQLSchema = new SchemaGenerator().makeExecutableSchema(typeDefinitionRegistry, wiring); GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build(); String query = "{user(id:15){id,name,age}}"; ExecutionResult result = graphQL.execute(query); System.out.println("query: " + query); System.out.println(result.toSpecification()); } }
官方推薦第二種方式