graphql java sql_GraphQL标准的Java实现graphql-java概述
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概述相关推荐
- java芯片标准卡_J3H081芯片双界面JAVA卡CPU卡ATR值可修改T=1、T=0
J3H081芯片双界面JAVA卡CPU卡ATR值可修改T=1.T=0 J3H081芯片双界面JAVA卡CPU卡在高安全性的系统解决方案高性能智能芯片卡产品.它非常适合多应用市场,如银行与金融,移动通信 ...
- 燃!Java全球标准中国人参与制定,阿里成首个受邀中国公司
2018年5月17日,作为唯一中国代表,阿里巴巴获邀加入Java全球管理组织Java Community Process (JCP)的最高执行委员会.此次获得执行委员会席位,让中国企业首次加入到Jav ...
- JPDA Java调试标准
JPDA(Java Platform Debugger Architecture) Java调试标准 -----发送JDWP请求-----> Debugger ...
- javax.cache_新的Java缓存标准(javax.cache)
javax.cache 这篇文章探讨了新的Java缓存标准:javax.cache. 它如何适应Java生态系统 该标准由JSR107开发,作者是共同规范负责人. JSR107包含在JSR342开发的 ...
- 新的Java缓存标准(javax.cache)
这篇文章探讨了新的Java缓存标准:javax.cache. 它如何适应Java生态系统 该标准由JSR107开发,作者是共同规范负责人. JSR107包含在JSR342开发的Java EE 7中. ...
- java的标准注解和元注解
目录 注解Annotation实现原理与自定义注解例子 1.什么是注解 2.注解的用处 3.注解的原理 4.元注解 5.常见标准的Annotation 6.自定义注解 7.自定义注解实例 注解Anno ...
- 遵循Java EE标准体系的开源GIS服务平台之二:平台部署
传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...
- 遵循Java EE标准体系的开源GIS服务平台之一:平台架构
传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...
- java协议标准与规范
本栏目提供了大量的 Java 技术标准与规范的简介.官方网址以及 developerWorks 网站上相关的技术资源.通过本栏目,您不但可以了解当前 Java 社区主要的技术标准和规范,还可以通过查看 ...
- 招聘java是什么意思_企业招聘Java程序员的标准到底是什么?
为什么Java程序员找工作那么难?是否市场已经饱和?企业招聘Java程序员的标准是什么?很多找不到工作的Java程序员在经历过几次面试之后,就会对自己的技术能力产生怀疑,然而找工作和"酒香不 ...
最新文章
- PPDE英雄帖!广邀全球开发者执开源之桨,汇百川成海
- python是什么语言、即变量不需要显示声明数据类型-python中可以声明变量类型吗...
- javax.servlet.jsp.JspTagException:
- 无需一行代码,完成模型训练和部署,这个AI工具开始公测
- pdftk — PDF万用命令行工具
- Linux 内存管理(二)——伙伴系统
- 黑马程序员 Python学习笔记之变量
- Linux系统 Centos6 安装
- Linux随笔 - 修改主机名
- 与孩子一起学编程06章
- python数据分析-互联网常见9种数据分析方法
- 恶意软件相似度检测过程
- 人再囧途之泰囧.BD高清1280国语中英双字 附下载地址
- Markdown - 推荐一个markdown在线编辑器
- JavaEE中的依赖性——依赖查找
- mac升级node版本(用n升级nodejs)
- 服务器设置虚拟ip,服务器设置虚拟ip
- 初识vue-baidu-map
- 家庭观念算老几?(转)
- Comet OJ - Contest #10 沉鱼落雁