GraphQL标准提供了多种主流编程语言的实现,本文介绍其中的Java实现graphql-java。所谓GraphQL标准的实现,就是一个GraphQL服务器的实现,通过一组软件组件,以支持请求的解析、验证和执行GraphQL查询。

graphql-java就是GraphQL标准的Java语言实现之一,当前最新版本是8.0。在Maven项目中配置如下:

com.graphql-java

graphql-java

8.0

本文主要介绍graphql-java的核心的GraphQL Schema定义。

1. GraphQL Schema

就类似于数据库服务器要响应用户对数据库的访问,首先要定义数据库Schema一样。GraphQL服务器要是响应用户对REST数据的查询请求,也要定义一个描述服务数据的结构,就是GraphQL Schema。

为了定义GraphQL Schema,graphql-java提供了如下两种定义的方式:

代码中编程定义动态GraphQL Schema

GraphQLObjectType fooType = newObject()

.name("Ci")

.field(newFieldDefinition()

.name("product_number")

.type(GraphQLString))

.build();

如代码所示,运行中创建了新类型Ci,并为其定义了属性product_number,该属性的类型为Scalar的GraphQLString。

使用SDL (Schema Definition Language)在独立的资源文件中定义静态GraphQL Schema

创建src/main/resources/myschema.graphqls文件,定义类型Ci如下:

type Ci {

product_number: String

}

这里,为了示例,两种方式定义的GraphQL Schema完全等价。

实际上定义完整的GraphQL Schema还有具体的语法,请参考创建GraphQL Schema。

2. DataFetcher/TypeResolver

GraphQL Schema中的每个字段类型,都关联一个DataFetcher(在Node.js实现或Python实现中被称为resolver函数),用以为GraphQL Schema中的字段类型获取数据。数据源可以是数据库或REST服务,并将数据表示为Java POJO对象。DataFetcher对象可以直接读取Java POJO对象的属性,再使用Jackson或GSON转换为JSON格式的数据。

DataFetcher pnDataFetcher = new DataFetcher() {

@Override

public Object get(DataFetchingEnvironment environment) {

Map response = fetchPnFromDatabase(environment.getArgument("product_number"));

List errors = ((List)response.get("errors")).stream()

.map(MyMapGraphQLError::new)

.collect(Collectors.toList());

return new DataFetcherResult(response.get("data"), errors);

}

};

GraphQLObjectType objectType = newObject()

.name("Ci")

.field(newFieldDefinition()

.name("product_number")

.type(GraphQLString)

.dataFetcher(pnDataFetcher))

.build();

注意,这里的dataFetcher()方法的使用。

与DataFetcher获取数据的作用相似,TypeResolver提供了更强大的功能,能够根据获取的数据转换为对应的Schema中定义的字段类型,这对面向接口的编程有很大的意义。在一个获取数据的方法中,定义返回的类型是接口,而实际返回可能是实现该接口的任何对象,根据获取的数据转换为对应的对象,返回即可。

3. Runtime Wiring

创建完毕GraphQL Schema还只是开始,还要将其应用在GraphQL服务器上。这就类似于定义数据库结构的SDL脚本已经准备就绪,但是真正在数据库服务器上执行后才生效。

在GraphQL服务器上真正执行GraphQL Schema使其运行起来,是通过Runtime Wiring,这样才能够得到一个可执行的GraphQL Schema。典型代码如下:

File schemaFile = loadSchema("myschema.graphqls");

SchemaParser schemaParser = new SchemaParser();

TypeDefinitionRegistry typeRegistry = schemaParser.parse(schemaFile);

RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()....build();

SchemaGenerator schemaGenerator = new SchemaGenerator();

GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeRegistry, wiring);

4. GraphQL服务

已经有了完整的可响应请求的GraphQL Schema,现在就运行起来吧。

GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();

5. Execution请求GraphQL服务

1) 请求参数

在请求应用中,可以直接将请求参数以字符串的形式传递给GraphQL服务,如下所示:

ExecutionResult executionResult = build.execute("query { hero { name } }");

也可以先构建ExecutionInput对象(适合复杂的请求参数),然后再传递给GraphQL服务,如下所示:

ExecutionInput executionInput = ExecutionInput.newExecutionInput().query("query { hero { name } }")

.build();

ExecutionResult executionResult = build.execute(executionInput);

2)处理结果

GraphQL服务的响应结果在data中,如果出错则在

executionResult.getData().toString();

List errors = executionResult.getErrors();

如果要将得到的响应数据序列化为JSON格式,为了完全兼容GraphQL标准,建议首先将响应结果进行规范化转换,然后再调用Jackson或GSON等JSON库进行JSON格式转换。

Map toSpecificationResult = executionResult.toSpecification();

doWithJson(toSpecificationResult);

这里只讨论了同步的请求,异步请求可以参考其文档。

参考链接:

https://github.com/graphql-java/graphql-java

http://graphql-java.readthedocs.io/en/latest/

graphql java sql_GraphQL标准的Java实现graphql-java概述相关推荐

  1. java芯片标准卡_J3H081芯片双界面JAVA卡CPU卡ATR值可修改T=1、T=0

    J3H081芯片双界面JAVA卡CPU卡ATR值可修改T=1.T=0 J3H081芯片双界面JAVA卡CPU卡在高安全性的系统解决方案高性能智能芯片卡产品.它非常适合多应用市场,如银行与金融,移动通信 ...

  2. 燃!Java全球标准中国人参与制定,阿里成首个受邀中国公司

    2018年5月17日,作为唯一中国代表,阿里巴巴获邀加入Java全球管理组织Java Community Process (JCP)的最高执行委员会.此次获得执行委员会席位,让中国企业首次加入到Jav ...

  3. JPDA Java调试标准

    JPDA(Java Platform Debugger Architecture) Java调试标准 -----发送JDWP请求-----> Debugger                   ...

  4. javax.cache_新的Java缓存标准(javax.cache)

    javax.cache 这篇文章探讨了新的Java缓存标准:javax.cache. 它如何适应Java生态系统 该标准由JSR107开发,作者是共同规范负责人. JSR107包含在JSR342开发的 ...

  5. 新的Java缓存标准(javax.cache)

    这篇文章探讨了新的Java缓存标准:javax.cache. 它如何适应Java生态系统 该标准由JSR107开发,作者是共同规范负责人. JSR107包含在JSR342开发的Java EE 7中. ...

  6. java的标准注解和元注解

    目录 注解Annotation实现原理与自定义注解例子 1.什么是注解 2.注解的用处 3.注解的原理 4.元注解 5.常见标准的Annotation 6.自定义注解 7.自定义注解实例 注解Anno ...

  7. 遵循Java EE标准体系的开源GIS服务平台之二:平台部署

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  8. 遵循Java EE标准体系的开源GIS服务平台之一:平台架构

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  9. java协议标准与规范

    本栏目提供了大量的 Java 技术标准与规范的简介.官方网址以及 developerWorks 网站上相关的技术资源.通过本栏目,您不但可以了解当前 Java 社区主要的技术标准和规范,还可以通过查看 ...

  10. 招聘java是什么意思_企业招聘Java程序员的标准到底是什么?

    为什么Java程序员找工作那么难?是否市场已经饱和?企业招聘Java程序员的标准是什么?很多找不到工作的Java程序员在经历过几次面试之后,就会对自己的技术能力产生怀疑,然而找工作和"酒香不 ...

最新文章

  1. PPDE英雄帖!广邀全球开发者执开源之桨,汇百川成海
  2. python是什么语言、即变量不需要显示声明数据类型-python中可以声明变量类型吗...
  3. javax.servlet.jsp.JspTagException:
  4. 无需一行代码,完成模型训练和部署,这个AI工具开始公测
  5. pdftk — PDF万用命令行工具
  6. Linux 内存管理(二)——伙伴系统
  7. 黑马程序员 Python学习笔记之变量
  8. Linux系统 Centos6 安装
  9. Linux随笔 - 修改主机名
  10. 与孩子一起学编程06章
  11. python数据分析-互联网常见9种数据分析方法
  12. 恶意软件相似度检测过程
  13. 人再囧途之泰囧.BD高清1280国语中英双字 附下载地址
  14. Markdown - 推荐一个markdown在线编辑器
  15. JavaEE中的依赖性——依赖查找
  16. mac升级node版本(用n升级nodejs)
  17. 服务器设置虚拟ip,服务器设置虚拟ip
  18. 初识vue-baidu-map
  19. 家庭观念算老几?(转)
  20. Comet OJ - Contest #10 沉鱼落雁

热门文章

  1. Java NIO框架Netty教程(二)
  2. 重启Oracle 服务
  3. 解决centos7 ssh连接慢的问题
  4. 百度地图KEY发布版SHA1和开发板SHA1如何获得
  5. Starting MySQL. ERROR! The server quit without updating PID file
  6. 在图层上使用CATransform3D制做三维动画-b
  7. Centos7安装Docker-1.9.1
  8. 移动分发端 基础统计指标经典业务代码节选--二次激活用户
  9. ZOJ-3103 Cliff Climbing 最短路
  10. 在下层捕获上层抛出的异常