GraphQL 既是一种用于 API 的查询语言也是一个知足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端可以准确地得到它须要的数据,并且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。java
基于node的服务端开发中,GraphQL技术较为成熟经常使用,在基于java的服务端开发中,因为国内对该API标准的了解程度不高,以及引入GraphQL可能须要维护两份重复数据(schema和相应java代码实现)。目前在Java服务端开发领域,Graphql Java的应用还较为有限。node
本文旨在从Java服务端开发的角度,介绍GraphQL的落地实践。由官方文档开始,按部就班的介绍引入GraphQL对服务端开发带来的好处,以及基于GraphQL Java框架的注解式声明方式,逐步优化GraphQL的引入流程。框架
graphql-java至少须要在java8平台上运行。maven
保证mavenCentral在repo当中工具
repositories { mavenCentral() }
添加依赖以下:gradle
dependencies { compile 'com.graphql-java:graphql-java:13.0' }
依赖以下:优化
<dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java</artifactId> <version>113.0</version> </dependency>
import graphql.ExecutionResult; import graphql.GraphQL; import graphql.schema.GraphQLSchema; import graphql.schema.StaticDataFetcher; import graphql.schema.idl.RuntimeWiring; import graphql.schema.idl.SchemaGenerator; import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeDefinitionRegistry; import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring; public class HelloWorld { public static void main(String[] args) { String schema = "type Query{hello: String}"; SchemaParser schemaParser = new SchemaParser(); TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema); RuntimeWiring runtimeWiring = newRuntimeWiring() .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world"))) .build(); SchemaGenerator schemaGenerator = new SchemaGenerator(); GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring); GraphQL build = GraphQL.newGraphQL(graphQLSchema).build(); ExecutionResult executionResult = build.execute("{hello}"); System.out.println(executionResult.getData().toString()); // Prints: {hello=world} } }
示例中展现了一个最简单的hello world示例,主要包含以下几个部分:ui
Schema,可理解为GraphQL的概要,描述了相关的类型信息、可执行的操做等。code
在本例中,咱们定义了一个Schema以下:xml
type Query{hello: String}
其中,Query类型的操做,只包含一个hello字段,而且返回String类型数据。
类型定义。在Java代码中,经过加载Schema文件或描述,将其解析为TypeDefinitionRegistry。
运行时织入。仅有Schema及其类型定义还不够,在Java中要实际运行GraphQL`,还须要显式指定定义中的每一个操做,该触发什么样的行为。
例如,在本例中,builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")
表示当查询Query类型下的hello字段时,返回值为"world"。
在结合前面TypeDefinitionRegistry和RuntimeWiring的基础上,生成的可运行的GraphQL实例。
每次执行GraphQL操做时,返回的结果对象。其中包含error字段,用于保存执行过程当中的报错信息。data字段,用于获取执行结果返回值。