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字段,用於獲取執行結果返回值。