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. burp使用

    只拦截特定网站数据包 我们以只拦截"www.baidu.com"为例 点击"Add"--布尔运算选择"And"--匹配类型选择"D ...

  2. Camtasia处理音频制作BGM

    我们在剪辑自己录制的视频时经常会需要同时对音频进行处理,camtasia是一个可以对视频的音频或者单独的音频文件进行处理的软件,那我们就来看看到底如何使用camtasia 2019(Win)来处理音频 ...

  3. 鱼骨图是什么?怎么用iMindMap画鱼骨图?

    鱼骨图是一种发现问题"根本原因"的方法,它也可以称之为"因果图".其特点是简捷实用,深入直观."鱼头"处标注的一般是问题或后果.按出现机会多 ...

  4. Linux root目录空间过小,加大空间

    1. 查看还有多少空间可以使用: df -h 这里可以看出来home的空间还很大,可以分配给root 2. 扩容根目录的思路如下: 将/home文件夹备份,删除/home文件系统所在的逻辑卷,增大/文 ...

  5. C语言讲义——文件操作

    fopen( ) 函数:创建一个新的文件或者打开一个已有的文件 FILE *fopen( const char * filename, const char * mode ); 关于参数mode的取值 ...

  6. 关于uniapp无法navigateTo跳转的解决办法

    今天在分包时突然无法跳转了,记个笔记 场景: 位于tabbar页面(主包)的子组件跳转到分包页面时,无法跳转 尝试办法: 使用uniapp原生跳转 uni.navigateTo({ url:'xxxx ...

  7. 测试:ADB

    配置 JAVA: 1.安装jdk的按抓包(傻瓜式安装不需要更改路径) 2.我的电脑右击属性--高级系统设置--环境变量--用户变量--新建:JAVA_HOME C:\Program Files\Jav ...

  8. 浅谈代理模式与java中的动态代理

    代理模式的定义: 代理模式是一个使用律非常高的模式,定义如下: 为其他对象提供一种代理,以控制对这个对象的访问. 类图: 简单的静态代理: public interface IRunner{ //这是 ...

  9. eclipse 老坑巨滑之内存溢出OOM

    绪:今天接手一个古老项目,tomcat6+jdk6.被   java.lang.OutOfMemoryError: PermGen space  啪啪打脸, 网上确实有很多解决方法,主要有三种类型:一 ...

  10. 虚拟机下Ubuntu共享文件夹不能显示的一种解决方法

    原文链接:https://blog.csdn.net/huyangzhilin/article/details/70666937