Graphql Tutorials(Episode 02)
1.前言
我们在上篇已经了解Graphql的使命以及Graphql的概况,接下来,我们跑起来另外一个Helloworld来开启继续学习。
2.Helloworld(使用Graphql 原生API)
这里呢,我们会用Graphql的原生API来搭建helloword
Java 8
SpringBoot
OKTA:洛杉矶的一个公司,为系统提供信息安全验证。
GraphQL Playground: 类似于Postman的工具,这里呢用Postman也可以,但是,我更喜欢GraphQL Playground黑色页面的风格。
Download:https://www.electronjs.org/apps/graphql-playground
完整Demo的地址:
https://github.com/lihao5257/GraphqlDemo.git 代码在master分支
我们进入正题。首先是schema.graphqls, 里面定义了Graphql API的结构。
# This is a comment
type Query {
bookById(id: ID): Book
allBooks: [Book]
} type Book {
id: ID
name: String
pageCount: Int
author: Author
} type Author {
id: ID
firstName: String
lastName: String
}
然后我们需要将上述文件进行解析,将解析后的关键字与逻辑的处理进行匹配。
1 public void init() throws IOException {
2 URL url = Resources.getResource("schema.graphqls");
3 String sdl = Resources.toString(url, Charsets.UTF_8);
4 GraphQLSchema graphQLSchema = buildSchema(sdl);
5 this.graphQL = GraphQL.newGraphQL(graphQLSchema).build();
6 }
7 // 解析SDL文件,然后,进行属性的绑定。
8 private GraphQLSchema buildSchema(String sdl) {
9 TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(sdl);
10 RuntimeWiring runtimeWiring = buildWiring();
11 SchemaGenerator schemaGenerator = new SchemaGenerator();
12 return schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring);
13 }
14
15 private RuntimeWiring buildWiring() {
16 return RuntimeWiring.newRuntimeWiring()
17 .type(TypeRuntimeWiring.newTypeWiring("Query")
// bookById的查询,与右边的逻辑进行绑定。当API调用bookById这个方法时,程序就知道该如何进行查询了。
18 .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()))
19 .type(TypeRuntimeWiring.newTypeWiring("Book")
20 .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher()))
21 .type(TypeRuntimeWiring.newTypeWiring("Query")
22 .dataFetcher("allBooks", graphQLDataFetchers.getAllBooksDataFetcher()))
23 .build();
24 }
接下来,我们要编辑与bookById绑定的方法,比如,从DB里查数据,或是从缓存中查找等等。
1 public DataFetcher<Object> getBookByIdDataFetcher() {
2 return dataFetchingEnvironment -> {
3 String bookId = dataFetchingEnvironment.getArgument("id");
4 return books
5 .stream()
6 .filter(book -> book.get("id").equals(bookId))
7 .findFirst()
8 .orElse(null);
9 };
10 }
11
12 public DataFetcher<Object> getAuthorDataFetcher() {
13 return dataFetchingEnvironment -> {
14 Map<String, String> book = dataFetchingEnvironment.getSource();
15 String authorId = book.get("authorId");
16 return authors
17 .stream()
18 .filter(author -> author.get("id").equals(authorId))
19 .findFirst()
20 .orElse(null);
21 };
22 }
23
24 public DataFetcher<Object> getAllBooksDataFetcher() {
25 return dataFetchingEnvironment -> {
26 return books;
27 };
28 }
到这里,我们API编辑的部分就算完成了。主要的流程就是按照上一篇博文中讲解的Graphql初始化流程来的。
大家可以发现,这种原生API的方式,非常的繁琐,我们必须手动地将查询方法(如:bookById)和对应的逻辑(graphQLDataFetchers.getBookByIdDataFetcher())绑定在一起。这就非常麻烦。为了简化流程,开发者会使用另外一种基于API,它基于原生API,在其基础上进行了包装,让开发者只需要关注于业务。
3.Helloworld(使用GraphQL Java Tools)
demo地址:
https://github.com/lihao5257/GraphqlDemo.git 选择tutorial-graphql-java-tools-hello分支
同样,先是schema.graphqls文件的创建
# This is a comment
type Book {
title: String!
isbn: String!
} type Query {
getBook(isbn: String!): Book
getAllBooks : [Book]
} type Mutation {
createBook(book:BookWrapper):Book
} input BookWrapper{
title:String!
isbn:String!
}
我们接下来要创建Book的模型
1 public class Book {
2
3 private String title;
4 private String isbn;
5
6 public Book(String title, String isbn) {
7 this.title = title;
8 this.isbn = isbn;
9 }
10
11 public String getTitle() {
12 return title;
13 }
14
15 public void setTitle(String title) {
16 this.title = title;
17 }
18
19 public String getIsbn() {
20 return isbn;
21 }
22
23 public void setIsbn(String isbn) {
24 this.isbn = isbn;
25 }
26
27 }
然后,要创建一个Resolver,意思是调用API(如:调用getBook())时,处理请求的业务逻辑是什么样的。
// 处理查询的方法时,需要继承GraphQLQueryResolver 这个接口
public class BookResolver implements GraphQLQueryResolver { static List<Book> books = null;
static {
books =new ArrayList<Book>();
books.add(new Book("Harry Porter 1", "1111"));
books.add(new Book("Harry Porter 2", "2234"));
books.add(new Book("Harry Porter 3", "2434324"));
books.add(new Book("Harry Porter 4", "112343211"));
books.add(new Book("Harry Porter 5", "5646"));
} // method名字跟API调用的名字一致,在方法里面写具体业务逻辑即可
public Book getBook(String isbn) {
return new Book("Learn GraphQL", "309234324");
} public List<Book> getAllBooks() {
return books;
}
}
然后,就OK啦,非常的简便。省去了一切非业务的操作。这个处理方法有些像JPA,操作对象的的感觉。至此,我们的helloword完成了。希望大家亲自跑一跑,感受一下。
3.完整demo
这个完成的demo中,有增删改查的完整功能,以及异常处理等操作。大家感兴趣的话,可以看看。
https://github.com/lihao5257/GraphqlDemo.git graphql-java-tools-full-demo分支
4.小结
Graphql入门基础,并不难。GraphQL Java Tools的这样类似JPA的,通过对象来操作事情的思想很好,这个月找机会研究一下JPA以及GraphQL Java Tools的源码,学习一下。
References:
https://www.graphql-java.com/tutorials/getting-started-with-spring-boot/#graphql-in-3-minutes
https://www.graphql-java.com/documentation/v15/
https://graphql.org/
https://www.graphql-java-kickstart.com/
Graphql Tutorials(Episode 02)的更多相关文章
- Graphql Tutorials(Episode 01)
1.前言 最近认识到Graphql,它是一个基于DSL的api.我曾接触过一个pos机刷卡系统,它是基于JSON-DSL语言开发的框架,很有趣.可是后来,没有机会深入研究.直到最近我认识了Graphq ...
- 用 eric6 与 PyQt5 实现python的极速GUI编程(系列02)---- 省市县(区)下拉列表多级联动
[概览] 本文实现如下的程序: 主要步骤如下: 1.在eric6中新建项目,新建窗体 2.(自动打开)进入PyQt5 Desinger,编辑图形界面,保存 3.回到eric 6,对上一步得到的界面文件 ...
- Kotlin中变量不同于Java: var 对val(KAD 02)
原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...
- 资料下载:生活方向盘PPT以及活动录音(2011.02)
本文已挪至 http://www.zhoujingen.cn/blog/676.html 免费PDF和活动录音下载: http://down.51cto.com/data/216824 敏捷个人生活方 ...
- C#/JAVA 程序员转GO/GOLANG程序员笔记大全(DAY 02)
------------------- 指针 go 保留的 c 语言指针的操作,同时增加了自动垃圾回收机制 var a = new(int) *a = // &a 内存地址 --------- ...
- DLP显示单元(威创)
品牌:威创型号:E-SX675生产商:广东威创视讯科技股份有限公司1.生厂商简介(1)生产商概述广东威创视讯科技股份有限公司(简称威创)成立于2002年,专业从事大屏幕拼接显示产品及其解决方案的研发. ...
- 带你十天轻松搞定 Go 微服务之大结局(分布式事务)
序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...
- 朱晔的互联网架构实践心得S2E5:浅谈四种API设计风格(RPC、REST、GraphQL、服务端驱动)
Web API设计其实是一个挺重要的设计话题,许多公司都会有公司层面的Web API设计规范,几乎所有的项目在详细设计阶段都会进行API设计,项目开发后都会有一份API文档供测试和联调.本文尝试根据自 ...
- API设计风格(RRC、REST、GraphQL、服务端驱动)
API设计风格(RRC.REST.GraphQL.服务端驱动) Web API设计其实是一个挺重要的设计话题,许多公司都会有公司层面的Web API设计规范,几乎所有的项目在详细设计阶段都会进行API ...
随机推荐
- 博客新域名www.tecchen.tech
新年祝福 祝新的一年,大朋友实现所有梦想,小朋友健康成长- 新域名 https://www.tecchen.tech 有效期:10年 旧链接 之前的链接请自行替换为新链接地址,包括但不限于以下二级域名 ...
- 还不懂Java高并发的,建议看看这篇阿里大佬的总结,写的非常详细
前言 进程是计算机中程序关于某几何数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位.是操作系统结构的基础 线程可以说是轻量级的进程,是程序执行的最小单位,使用多线程而不用多进程去进行并发程 ...
- 深度分析:面试90%被问到的 Session、Cookie、Token,看完这篇你就掌握了!
Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 Cookie 的主要目的 ...
- 刚安装好的MathType怎么使用
对于刚接触公式编辑器的新手来说,难免会存在很多疑问:如何使用刚安装好的Word公式编辑器?安装好公式编辑器之后,我们在哪里找到这个工具呢?下面就针对大家的这些疑问,来给大家介绍下首次使用MathTyp ...
- 攻克solo第七课(Randy Rhoads风格)
本期文章,笔者将通过Guitar Pro 7吉他软件跟大家分享一下Randy Rhoads的solo句子. 相信很多精研电吉他的朋友都会听过这个一手把Ozzy Osbourne从离开黑色安息日乐队的深 ...
- 网络系列之 cookie增删改查(封装)
什么是cookie 呢?简单来说,这个小东西,会记录你的 浏览器 浏览习惯,或 账号密码等, 以便于提高用户的体验感. 举个例子: 你们有没有发现,去淘宝一些购物网站, 你搜索了 椅子, 挑选了一会椅 ...
- 蓝桥杯——剪邮票(2016JavaB组第10题)
剪邮票(16JavaB10) 如[图1], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2],[图3]中,粉红色所示部分就是合 ...
- (1)Consul在linux环境的集群部署
1.Consul概念 1.1什么是Consul? Consul是一种服务网格解决方案,是HashiCorp公司推出的开源组件,由Go语言开发,部署起来很容易,只需要极少的可执行程序和配置.同时Cons ...
- Prafab Varient 预制体变体
预制体与类的类比思维: 预制体相当于一个类,当它应用到场景当中,就是一个实例. 类的继承特性也充分运用到预制体中,即预制体变体. 相似预制体的需求场景: 例子1:多个游戏的窗口 ...
- gitlab 文件读取+rce复现 CVE202010977
文件读取实现,首先生成两个project 再任意一个project添加issue,然后描述如下: ![a](/uploads/11111111111111111111111111111111/../. ...