-
GraphQL是什么GraphQL是一种开源数据查询和操作语言,以及用于使用现有数据完成查询的运行时。 GraphQL是在2012年由Facebook内部开发,然后在2015年公开发布。它提供了一种更高效,更强大,更灵活的REST和ad-hoc Web服务架构替代方案。
官方站点https://graphql.cn/
官方说明一种用于 API 的查询语言GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
GraphQL的优点相比REST风格接口,GraphQL的优点主要有两个:一次请求完成多个REST接口的工作但是这一点通过整理RESTful接口同样可以实现,但这需要为每一类功能定制一个RESTful接口,同时RESTful接口返回的数据量显然是大于请求端所需的量,造成带宽浪费。定制化的返回数据由于上述第1点,GraphQL请求的数据可以由调用端定制返回的数据,依据是GraphQL的Schema文件
GraphQL的Java实现Facebook提供的仅仅是GraphQL Schema文件及查询语句的语法,并提供了一个基于Node.js的参考实现。graphql-java是参照Node.js版本实现的Java版本,是当前比较靠谱的GraphQL Java实现方案。
-
DataFetchingEnvironment的方法<T> T getSource();获取返回对象<T> T getRoot();获取返回对象,top levelMap<String, Object> getArguments();boolean containsArgument(String name);<T> T getArgument(String name);获取查询参数<T> T getContext();自定义context,可在整个query期间保持不变GraphQLFieldDefinition getFieldDefinition();List<Field> getFields();Field getField();GraphQLOutputType getFieldType();ExecutionTypeInfo getFieldTypeInfo();GraphQLType getParentType();GraphQLSchema getGraphQLSchema();Map<String, FragmentDefinition> getFragmentsByName();ExecutionId getExecutionId();DataFetchingFieldSelectionSet getSelectionSet();ExecutionContext getExecutionContext();
DataFetchingFieldSelectionSet用于判断查询内容,可以使用通配符
DataFetcher smartUserDF = new DataFetcher() {
@Override
public Object get(DataFetchingEnvironment env) {
String userId = env.getArgument("userId");
......
-
DataFetcher用于获取数据动态获取可使用匿名实现DataFetcher
environment -> rockmanService.getHerosFromSeries(environment.getArgument("series"))
静态内容可使用静态实现类StaticDataFetcher
TypeResolver为SDL的Interface或Union设置TypeResolver,用于泛型的向下转型
new TypeResolver() {
@Override
......
-
数据类型定义Scalar: 基本类型Object: 对象Interface: 接口Union: 联合InputObject: input CharacterEnum: 枚举类型
基本类型定义Java基本类型: GraphQL在Java对应的基本类型类String: GraphQLStringBoolean: GraphQLBooleanInteger: GraphQLIntegerFloat: GraphQLFloatID: GraphQLID // 这个比较特别,支持多种类型Long: GraphQLLongShort: GraphQLShortByte: GraphQLByteBigDecimal: GraphQLBigDecimalBigInteger: GraphQLBigInteger
-
语法schema 定义查询入口type 定义类enum 枚举interface 接口implements 实现[foo] 数组! 非空union Character = Doctor | Hunter 即反向的interfaceinput Character 输入对象?extend type Human 在原有定义上添加属性,常用于top level
示例文件// 这个是top node,标识入口
schema {
query: QueryType
}
// 入口支持的查询类型
......
-
GitHub地址https://github.com/graphql-java/graphql-java
官方文档https://graphql-java.readthedocs.io/en/latest/
graphql-java的一些辅助Git项目https://github.com/graphql-java/awesome-graphql-java
集成很简单,根据官方文档集成即可,我使用的是Maven集成
<dependency>
<groupId>com.graphql-java</groupId>
......