热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:译关于GraphQL,你需要知道这些

篇首语:本文由编程笔记#小编为大家整理,主要介绍了译关于GraphQL,你需要知道这些相关的知识,希望对你有一定的参考价值。https://medium.com

篇首语:本文由编程笔记#小编为大家整理,主要介绍了译关于GraphQL,你需要知道这些相关的知识,希望对你有一定的参考价值。



https://medium.com/@weblab_tech/graphql-everything-you-need-to-know-58756ff253d8

【译者注:链接序号对应下面索引列表,另外可以点击阅读原文查看详细的链接文章】

【译】关于GraphQL,你需要知道这些

在你已经构建并使用了 REST API 很长一段时间后,最近可能听说了一个 API 技术领域的的新星 —— GraphQL。有些人说它很好,但另一些人并不这么认为。现在,我相信你一定会好奇 GraphQL 到底是什么,它与传统方法有什么不同?

本文的主要目的是强调 GraphQL 的主要特性并讨论这一特定 API 规范的主要优点和缺点。

GraphQL 通常被描述为一种前端导向的 API 技术,因为它允许前端开发人员用比以前更简单的方式请求数据。Facebook 推出的这种查询语言的目的是以直观和可调的格式来制定客户端应用程序,来描绘其数据的先决条件及交互。最棒的一点是该语言不依赖于任何特定的数据库管理系统,并且被我们当前使用的数据格式和编码方式所支持。

传统 REST 的一个基本问题是客户端无法个性化请求数据集。除此之外,运行和控制多个接口是另一个难点,因为客户端总是需要从多个接口请求数据。

在搭建一个 GraphQL 服务器时,最重要的是用单一的 URL 入口来完成数据获取和更改。因此,用户可以通过传送一个说明所需内容的查询字符串来从服务器请求数据集。

在我们继续之前,在这里您可以找到我们的个人经验。

https://github.com/weblab-technology/graphql-example


GraphQL VS REST

【译】关于GraphQL,你需要知道这些

REST 和 GraphQL 的相似之处是它们都用于构建 API 并且通过 HTTP 进行管理。

就差异而言,REST 主要是一个以网络为中心的软件的结构概念,没有规范,也不获取明确的工具集。它更专注于 API 的稳定耐用性而非最优的性能。

而 GraphQL 是一种设计用于通过 HTTP 在一个接口端点上工作的查询语言,从而提升性能和适配性。因此,我甚至会说,将查询语言和开发 Web 服务的架构风格进行比较可能看起来很奇怪。 其他一些显著差异包括:


数据获取

数据获取无疑是 GraphQL 最引入的最引人注目的优势之一。在一个用于产生或恢复数据的标准 REST API 中,我们可能需要向众多接口发出请求。相比之下,GraphQL 提供了单一接口入口,通过它我们可以访问服务器上可用的数据。









  1. query {





  2.  books {





  3.    id





  4.    title





  5.    author





  6.    isbn





  7.    price





  8.  }





  9. }






数据获取以外

由于 REST 规范中的每个接口都包含已确定的数据格式,因此相比 GraphQL, REST 会获取比你所需的要多的数据。同样的,REST 获取数据集相对简单,客户端可以提交额外的请求以获取相关数据。

对于 GraphQL 来说,情况就完全不同了。因为它是一种查询语言并支持声明式数据提取,所以用户可以只从服务器获得它们实际需要的数据。

只选择书名和价格:









  1. query {





  2. books {





  3.   title





  4.   price





  5. }





  6. }






错误管理

REST 规范中的错误管理非常简单。我们所需要做的就是检查 HTTP 协议头来查看响应的状态。根据状态代码,我们可以快速定位错误并获得解决该错误的合适方法。而在 GraphQL 中,我们总是会收到 200 OK 的状态码。









  1. Request: query { books { error_field } }





  2. Response:





  3. Request Method:POST





  4. Status Code: 200 OK





  5. {“errors”:[{“message”:”Cannot query field \”error_field\” on type \”Book\”.”,”category”:”graphql”,”locations”:[{“line”:3,”column”:3}]}]}






缓存

由于 REST 采用的是支持缓存的 HTTP,因此可以使用它来避免重复获取资源。而 GraphQL 没有缓存系统,用户只能自己处理缓存的问题。


GraphQL 的优势

【译】关于GraphQL,你需要知道这些


版本管理

当从 API EDGE 收回受限的数据控制时,任何改变都被视为重大变化,因此需要更新版本。这也许是大多数 API 选择版本管理的最大原因。如果在一个 API 中包含更新功能需要最新版本,则会在频繁发版与 API 解释和保留之间进行调整。

相比之下,GraphQL 只返回所需的数据,因此无需触发重大更改就可以通过最新的类型和字段来包含最近的功能。


弃用非常容易

在使用 GraphQL 时,你可以方便地弃用字段。GraphQL 用户必须在查询中说明他们需要的字段。









  1. author_name => [





  2.  type => Type::string(),





  3.  deprecationReason => Deprecated. Use author field’,





  4. ],





REST API 则以不同方式的工作。虽然基本路径可以在所有 REST API 中访问,但并非所有 REST API 都带有有稀有的属性。

相比之下,GraphQL 使得监控特定的字段使用情况变得非常容易。API 持有者可以知晓特定客户端弃用的字段。


性能优化

相比 REST 通常默认返回全部请求数据,GraphQL 通常是返回最少的所需要的请求数据。尽管事实上,如果 REST API 返回了基本部分的数据,使用 GraphQL 会默认传输更多的片段。


GraphQL的缺点

【译】关于GraphQL,你需要知道这些


GraphQL 不容易缓存

REST 使用 HTTP 约定的存储方式,这使得当前的客户端和代理可以完美地工作来帮助服务器和客户端,而 GraphQL 则需要完全不同的方法。当然,当你必须重新排列数据集时,使用 REST 并非那么容易。你需要使用 Redis 集合并祈求你的客户端可以正常缓存。

正如官方文档 [1] 所说的那样,“在基于入口端点的 API 中,客户端可以使用 HTTP 缓存来确定两个资源是否相同,从而轻松避免重新获取资源。这些 API 中的 URL 是全局唯一标识符,客户端可以利用它来构建缓存。然而,在 GraphQL 中,没有类似 URL 的基元能够为给定对象提供全局唯一标识符。这里提供为 API 暴露这种标识符以供客户端使用的最佳实践。“


授权问题

授权问题也是我们在使用 GraphQL 时需要注意的一个重要问题。我们可以将 GraphQL 看作领域特定语言。 它仅仅是我们放在数据服务和客户端之间的中间层。授权完全是一个单独的层,语言本身不会帮助验证申请或使用。 但是,你可以使用 GraphQL 将客户端与预计的入口令牌关联起来。这与我们在 REST 中遵循的方法非常相似。


检测和解决 n + 1 问题

【译】关于GraphQL,你需要知道这些


什么是 n + 1 问题?

n + 1 问题是后端实现 GraphQL 时可能面临的最明显的优化问题。

如果你没有优化你的 GraphQL 查询,你最终可能会在一次请求中进行多次查询。如果没有适当的缓存或批处理系统,每当确定一个字段时,普通的服务器都会向数据库发出新的请求。DataLoader 无疑是最好的解决方案,它可以极大地增强后端的性能,特别是在 GraphQL 服务器中。

用一个简单的例子来表示 n + 1 问题:









  1. query {





  2. users {





  3.    name





  4.    education {





  5.      degree





  6.      year





  7.    }





  8.    age





  9.    address {





  10.      country





  11.      city





  12.      street





  13.    }





  14.  }





  15. }





使用 REST API 来评估、识别和解决 n + 1 问题相对容易。尽管这种情况与 GraphQL 有所不同。 幸运的是,Facebook 正在为这个问题开发一个可行的解决方案 —— DataLoader。


Dataloader 是什么?

【译】关于GraphQL,你需要知道这些

DataLoader 主要是一个工具,用户可以使用它来读取数据并使其可以被 GraphQL 方法访问。我们可以使用此工具直接从记录中读取数据,而不是依赖 SQL 查询。


怎么运行的?

DataLoader 主要综合使用了批处理和缓存。它可以用于批量加载客户端查询的多个请求的回答。此外,它还会缓存回复并在连续查询相关类似资源时使用缓存。


GraphQL 中的 Queries、Mutations 和 Subscriptions

我们已经强调了一些有关 GraphQL 的重要内容。但是,为了开发一个功能齐全的应用程序,我们还需要了解一些可以用来提高我们工作的功能和性能的其他内容。


Queries

顾名思义,Queries 是客户端向服务器发出的数据请求。与 REST 采用的有明确的详细的格式的多个接口不同的是,GraphQL 仅有单一的入口接口,使客户端从预定义框架中确定实际需要的信息。

例如,









  1. {





  2. Users {





  3.   name





  4. }





  5. }





上文查询中的'Users'字段被称为根字段,而任何后面的数据被称为净载荷。

此查询将生成所有用户的名称列表。









  1. {





  2.  Users”: [





  3.  {“name”: Damira”},





  4.  {“name”: Michael”}





  5.  {“name”: Salman”}





  6.  {“name”: Sara”}





  7.  {“name”: Maria”}





  8. ]





  9. }





显而易见,这个查询返回了用户名(这是因为在我们的查询请求中,我们已经明确指出我们只需要名称列表)。 对于任何其他请求,我们需要为此添加具体的细节。

例如,假设我们希望从列表中访问最后3个用户的信息。 我们现在可以添加参数来实现这一点。









  1. {





  2.  Users (last: 3) {





  3.    name





  4.    username





  5. }}





所以,我们已经了解了如何使用'Queries'来从服务器获取数据。现在我们来看看在 GraphQL 中添加、忽略或更新数据的方式。


Mutations

Mutations 用于添加、更新或删除数据。该结构与查询几乎一致,除了你需要在开头添加“Mutations”这个词。 例如,









  1. mutation {





  2.  createUser (name : John”, username: jo123”){





  3.    name





  4.    username





  5.  }





  6. }






Subscriptions

Subscriptions 可以用来设置和保留和服务器之间的实时连接。这使你可以获得有关相关事件的实时信息。大多数情况下,客户需要订阅特定的事件才能获取相应的数据。

请前往[官网文档](http://graphql.org/learn/queries/) 了解更多详情。


两全其美

【译】关于GraphQL,你需要知道这些

尽管 GraphQL 解决了一些问题,但它仍然存在一些缺陷和不足,比如验证、策略和缓存等。 由于它本身是不确定的,它并没有指导用户如何应用。 除此之外,后端服务器与客户端之间存在一个非具体层可能会非常令人不安。

查看 Apollo Stack 提供的指南[2] 可以找出一些基本问题的答案。

如果你有一个正在运行的项目,那么你从原始的 RESTful API 迁移到到 GraphQL 将十分困难。 但好消息是,你可以同时使用这两种 API 技术来各取所需。

例如,你可以使用 GraphQL query 来开始重构前端获取数据的代码,然后开始整合 mutations。 它将允许你逐渐地减少控制器中的操作。

此外,还可以让这两种方法在你项目中的很长一段时期内同时工作。 例如,如果你想简化授权机制,你可以始终从 REST 框架获得帮助。


结论

【译】关于GraphQL,你需要知道这些

回想起SOAP[3] 作为计算机网络中网络服务应用在交换结构化信息时采用的强大的协议规范,是 90 年代后期的热门并且得到了广泛的普及。然而,SOAP 相关的有效载荷明显较高,而且之前的应用程序碎片也会增加阻塞几率。

为了满足更实用和适应性更强地发布和利用网络服务,REST 作为一种新的方法出现了。这个概念非常简单直接,完全无状态,因此可以摒弃任何不相关的复杂因素。除此之外,这种方法还可以方便地与 JSON 和 XML 结合。但是,数据的一致性是最大的障碍。另外,关于如何管理版本的意见分歧也是一个问题。为了解决这些问题,Facebook 提出并为开发人员提供了一个两全其美的解决方案 - GraphQL。

GraphQL 并不是一个没有具体和实践基础说明的解决方案。 RESTful API 多年来在效率和性能方面都有很好的表现。GraphQL 弥补了 REST 的不足,而 REST 则填补了 GraphQL 中存在的空白。

值得注意的是,GraphQL 和 REST 的情况与关系型数据库和非关系型数据库的情况完全相同。

在使用 GraphQL 时,HTTP协议肯定是客户端与服务器通信协议的最佳选择,这主要是因为它的广泛性。 然而,当我们采用 HTTP 2 协议时,性能还是有问题的。

尽管 GraphQL 解决了现存的很多问题,但是选择任何一种 API 规范仍然很困难,因为你很可能在某个时候需要同时使用这两种规范。

从设计到应用的整体功能,选择 API 框架将对整个 API 过程产生影响。因此,这种选择必须是有远见的,而不是仅仅基于基本的信仰。


一些有用的刊物

https://github.com/weblab-technology/graphql-example

https://www.researchgate.net/publication/311989237ImplementingGraphQLasaQueryLanguageforDeductiveDatabasesinSWI-PrologUsingDCGsQuasiQuotationsand_Dicts

https://www.springer.com/gp

https://github.com/graphcool-examples/react-graphql


扩展阅读

[1]https://graphql.org/learn/caching/ [2]https://medium.com/apollo-stack/a-guide-to-authentication-in-graphql-e002a4039d1 [3]https://simple.wikipedia.org/wiki/SOAP_%28protocol%29




推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
旧梦半分_399
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有