Facebook 如何在Golang中搭建GraphQL

多年来,人们不时在经常使用RESTAPI来满足开发需求,但得成功少量不用要的调用后,开发者能力灵敏经常使用。例如,假设Web和移动设施所需的数据不同,咱们还须针对Web和移动设施创立两个不同的端点。

因此,Facebook创立了一种查问言语——GraphQL,该言语可以准确地给出开发者查问的内容,洁净拖拉,也让 API更容易地随着期间推移而演进,还能用于构建弱小的开发者工具。

本文将重点引见GraphQL的关键性能,以及就API而言它存在的优缺陷。文末将展现一个经常使用Golang的便捷程序(已搭建GraphQL)。

什么是GraphQL?

GraphQL是用于API的查问言语,它是主机端运转时,经过为数据定义的类型系统口头查问。

GraphQL是一种查问言语,适用许多畛域,但通罕用来在客户端和主机运行程序之间搭桥。次要经常使用的是哪个网络层,所以可以在客户端和主机运行程序之间读取和写入数据。(RobinWieruch《GraphQL指南》)

只管GraphQL是查问言语,但它与数据库没有间接相关,也就是GraphQL不限于恣意SQL或是NoSQL的数据库。GraphQL位于客户端和主机端,经过API衔接/访问。开发这种查问言语的目的之一是经过提供所需的数据来促成后端、前端或移动运行程序之间的数据通讯。

GraphQL的操作

1. 查问(Query)

查问用于读取或失掉值。无论哪种状况,操作都是一个便捷的字符串,GraphQL主机可以解析该字符串并以特定格局的数据启动照应。

你可以经常使用查问操作从API恳求数据。查问形容须要从GraphQL主机失掉的数据,发送查问其实是按字段要求提取数据。(Eve Porcello、AlexBanks著《学习GraphQL》)

2. 形式(Schema)

GraphQL经常使用Schema形容数据图的状态。这样的Schema定义类型的档次结构,附丽的是从后端数据存储区填充的字段,也准确示意客户端可以对数据图口头哪些查问和突变。

3. 合成器(Resolver)

合成器是担任为Schema繁多字段填充数据的性能。它可以用你定义的任何形式填充该数据,例如从后端数据库或第三方API提取数据。

4. 突变(Mutation)

修负数据存储中的数据并前往一个值,它可用于拔出、降级或删除数据。

突变与查问原理相反:它具备字段和对象、参数和变量、片段和操作称号,以及前往结果的指令和嵌套对象。(RobinWieruch著《GraphQL之路》)

5. 订阅(Subscription)

将数据从主机推送到客户端的方法是选用侦听来自主机的实时信息。

GraphQL的订阅来自Facebook的实在用例。开发团队宿愿找到一种方法,不刷新页面就能实时显示发文取得的有效点赞(Live Likes)。(EvePorcello、Alex Banks著《学习GraphQL》)

GraphQL的好处与劣势

1. 好处

(1) 开发迅速

来看一个案例:如何失掉图书借阅者的数据。在视图中,首先我要显示书籍列表,书籍列表菜单显示中出现一个借阅者的列表。在RESTAPI中,须要创立新的端点以前往图书清单,再创立一个新的端点以前往每本书的借阅人。

与REST API不同,GraphQL中仅经常使用一个端点就可以前往书籍列表和借阅者列表了。

经常使用以下示例GraphQL查问:

(2) 灵敏性

来看一个案例:如何失掉书籍具体信息。在网络视图上,我想展现书籍具体信息,例如称号、多少钱和引见。在RESTAPI中须要创立一个新的端点以前往称号、多少钱、引见等的书籍具体信息。

假设在移动端检查时,只想展现图书具体信息中的称号和多少钱怎样办?假设经常使用与Web视图相反的端点,则会糜费引见的数据。所以须要更改该端点外部的现有逻辑,或创立一个新的端点。

与REST API不同,GraphQL中仅经常使用一个端点即可依照Web或移动设施的需求前往书籍具体信息。在GraphQL中,只有更改查问。

(3) 保养便捷,易于经常使用

2. 缺陷

代码成功

成功环节经常使用了Golang编程言语,这里是名目架构:

在依赖版本和依赖治感性能上经常使用的是go模块。用graphql-go来支持查问、突变和订阅;用graphql-go-handler来支持处置器。此时,我将创立一个便捷的程序,这里经常使用GraphQL为具体书目创立CRUD。步骤如下:

先新建一个环境文件夹,而后新建一个名为connection.yml的文件:

而后创立一个架构文件夹,创立名为databaseConfiguration.go、environmentConfiguration.go和model.go的文件。这个文件夹用来性能数据库并从connection.yml读取数据。

(1)>

您可能还会对下面的文章感兴趣: