1.前言

最近认识到Graphql,它是一个基于DSL的api。我曾接触过一个pos机刷卡系统,它是基于JSON-DSL语言开发的框架,很有趣。可是后来,没有机会深入研究。直到最近我认识了Graphql,所以想深入学习,打算写一个系列完整的posts,记录一下。

2.什么是Graphql

你就可以理解成操作数据的API。

如果你使用过Restful,那么理解Graphql也会相当容易。在Restful中,我们为了查询数据,有可能进行了多次查询才能得到我们想要的数据;也可能查询了一次,但是里面大部分数据都是我们这次查询中不需要的。为了解决上述的问题,Graphql出现了。

它是Facebook于2012年开发的内部系统,于2015年发布面向大众。

3.例子

我们来看看它的样子,感受一下:

Post Request:(很像JSON,但不是)

{
orders {
id
productsList {
product {
name
price
}
quantity
}
totalAmount
}
}

Answer:

{
"data": {
"orders": [
{
"id": 1,
"productsList": [
{
"product": {
"name": "orange",
"price": 1.5
},
"quantity": 100
}
],
"totalAmount": 150
}
]
}
}

4.Helloword

我们先看一个最简单的例子,对Graphql整体有个认识。目的是让大家认知它大体的样子,以及GraphQL加载的流程。

 1 public class GettingStarted {
2
3 final static Logger logger = LoggerFactory.getLogger(GettingStarted.class);
4
5 public static void main(String[] args) {
6 String schema = "type Query{hello: String}";
7
8 SchemaParser schemaParser = new SchemaParser();
9 TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);
10
11 RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring()
12 .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")))
13 .build();
14
15 SchemaGenerator schemaGenerator = new SchemaGenerator();
16 GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
17
18 GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();
19 ExecutionResult executionResult = build.execute("{hello}");
20
21 System.out.println(executionResult.getData().toString());
22 // Prints: {hello=world}
23 }
24
25 }

我们可以看到上面的例子中,第6行,我们定义了schema,如果在项目中,应该是一个schema文件。读取这个schema文件后,进行解析得到TypeDefinitionRegistry。然后是执行时的绑定,RuntimeWiring,也即是客户端发送一个请求“hello”,服务端根据这个请求,应该进行什么样的处理。接下来,用TypeDefinitionRegistry和RuntimeWiring,生成GraphQLSchema,进行生成GraphQL。在第19行中,就是执行请求的部分,最后在21行,将返回结果打印出来。

上面的这段话整理一下,流程如下:

到此为止,我们了解了Graphql的背景,对它有个整体的认识。不要着急,知识一点点学习积累。在下一篇的post中,我会给出更具体的示例。

这篇post代码我放在了Github上:

https://github.com/lihao5257/GraphqlDemo.git     分支是master

参考链接:

https://en.wikipedia.org/wiki/GraphQL

Graphql Tutorials(Episode 01)的更多相关文章

  1. Graphql Tutorials(Episode 02)

    1.前言 我们在上篇已经了解Graphql的使命以及Graphql的概况,接下来,我们跑起来另外一个Helloworld来开启继续学习. 2.Helloworld(使用Graphql 原生API) 这 ...

  2. IDEA(2018.01)安装和破解

    IDEA(2018.01)安装和破解 1.下载IDE https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.下 ...

  3. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...

  4. 用 eric6 与 PyQt5 实现python的极速GUI编程(系列01)--Hello world!

    [题记] 我是一个菜鸟,这个系列是我的学习笔记. PyQt5 出来有一段时间了, PyQt5 较之 PyQt4 有一些变化,而网上流传的几乎都是 PyQt4 的教程,照搬的话大多会出错. eric6 ...

  5. A Mini Locomotive(动态规划 01)

     /*  题意:选出3个连续的 数的个数  为K的区间,使他们的和最大 分析: dp[j][i]=max(dp[j-k][i-1]+value[j],dp[j-1][i]);   dp[j][i]:从 ...

  6. 用js来实现那些数据结构15(图01)

    其实在上一篇介绍树结构的时候,已经有了一些算法的相关内容介入.而在图这种数据结构下,会有更多有关图的算法,比如广度优先搜索,深度优先搜索最短路径算法等等.这是我们要介绍的最后一个数据结构.同时也是本系 ...

  7. 用js来实现那些数据结构(栈01)

    其实说到底,在js中栈更像是一种变种的数组,只是没有数组那么多的方法,也没有数组那么灵活.但是栈和队列这两种数据结构比数组更加的高效和可控.而在js中要想模拟栈,依据的主要形式也是数组. 从这篇文章开 ...

  8. C#/Java 程序员转GO/golang程序员笔记大全(day 01)

    前言: 整理一下学习 Go 语言的笔记,作为一名老程序,学习一名新的开发语言自然不需要像小白那样从 HelloWorld 看起. 简单整理一下 Go 的一些差异处,希望对大家学习 go 有点帮助,不正 ...

  9. Codeforces 556A Case of the Zeros and Ones(消除01)

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Description Andr ...

随机推荐

  1. bWAPP----HTML Injection - Reflected (POST)

    bWAPP--low--HTML Injection - Reflected (POST) 只不过是把传递方式换成post, 防护的三个级别和内容与GET相同 1 function htmli($da ...

  2. 企业级工作流解决方案(六)--微服务消息处理模型之与Abp集成

    身份认证传递 对于Abp比较熟悉的朋友应该对他里面的用户身份认证比较熟悉,他是通过实现微软提供的权限认证方式实现的,用户登录身份信息存储在System.Security.Claims.ClaimsPr ...

  3. 一 HTML基础入门

    HTML概念 HTML是标记语言,由W3C组织提供的一套标记标签组成.其使用标记标签来描述网页,一个网页除了由大量的标签组成,还有后续要学习的css样式和JavaScript脚本组合而成. 网页与网站 ...

  4. 看完这篇还不会 Elasticsearch 搜索,那我就哭了!

    本文主要介绍 ElasticSearch 搜索相关的知识,首先会介绍下 URI Search 和 Request Body Search,同时也会学习什么是搜索的相关性,如何衡量相关性. Search ...

  5. 接上一篇:(二) IOC的概念和作用

    IOC的概念和作用 控制反转(IoC:Inversion of Control)把创建对象的权利转交给框架(框架的重要特征),并非面向对象的专用术语. 它包含依赖注入(DI:Dependency In ...

  6. Visual Studio 调试技巧之即时窗口的妙用

    在 Visual Studio 中有一个窗口叫 Immediate 窗口,中文版本应该叫即时窗口.默认会在你启动调试时在 VS 编辑器中弹出来.你也可以通过 Debug | Windows | Imm ...

  7. JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠

    JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...

  8. centos7中安装redis出现的问题

    重现步骤: 1.解压redis包后 执行make命令.出现一堆东西,其中有gcc:命令未找到. 解决:安装 yum install gcc-c++(需要有网) 2.安装完gcc命令后,再make.出现 ...

  9. Java虚拟机之内存区域

    原创文章,转载请标明出处! 目录 一.背景 二.运行时内存区域概述 1.官方描述 2.中文翻译 3.内存区域简述 4.运行时数据区简图 5.运行时数据区详图 三.JVM线程 JVM数据区域与线程关系 ...

  10. Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载

    ☞ ░ 前往老猿Python博文目录 ░ 一.简介 MoviePy是一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切.拼接.标题插入).视频合成(也称非线性编辑).视频处理或创建高 ...