CreateArtTechnology / Blog
  • GraphQL介绍
     8     2018-09-25 13:44:13

    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实现方案。

  • graphql-java中的细节补充
     19     2018-09-25 14:33:06

    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
    ......

  • graphql-java的数据类型
     33     2018-09-25 14:18:46

    数据类型定义Scalar: 基本类型Object: 对象Interface: 接口Union: 联合InputObject: input CharacterEnum: 枚举类型
    基本类型定义Java基本类型: GraphQL在Java对应的基本类型类String: GraphQLStringBoolean: GraphQLBooleanInteger: GraphQLIntegerFloat: GraphQLFloatID: GraphQLID // 这个比较特别,支持多种类型Long: GraphQLLongShort: GraphQLShortByte: GraphQLByteBigDecimal: GraphQLBigDecimalBigInteger: GraphQLBigInteger

  • SDL Schema文件
     8     2018-09-25 14:16:33

    语法schema 定义查询入口type 定义类enum 枚举interface 接口implements 实现[foo] 数组! 非空union Character = Doctor | Hunter 即反向的interfaceinput Character 输入对象?extend type Human 在原有定义上添加属性,常用于top level
    示例文件// 这个是top node,标识入口
    schema {
    query: QueryType
    }
    // 入口支持的查询类型
    ......

  • graphql-java介绍和集成
     25     2018-09-25 14:10:33

    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>
    ......