详情
订阅
  • 首页
  • 产品
  • 解决方案
  • 文档&开发者
  • 价格体系
  • 合作伙伴
联系我们
什么是 GraphQL
GraphQL 让开发人员可以自定义访问他们需要的数据。开发人员可以以绝对的灵活性请求他们需要的数据,以便他们确切地知道返回的数据是什么。
2022-09-07
#GraphQL
#RESTful
#无头CMS
什么是 GraphQL
GraphQL 让开发人员可以自定义访问他们需要的数据。开发人员可以以绝对的灵活性请求他们需要的数据,以便他们确切地知道返回的数据是什么。
2022-09-07
#GraphQL
#RESTful
#无头CMS
在这篇文章中
    与他人分享

    什么是 GraphQL?

    有很多解释可以回答“什么是 GraphQL?”。其中许多令人费解或导致对该主题的进一步混淆。用最简单的术语来说,GraphQL 让开发人员可以自定义访问他们需要的数据。开发人员可以以绝对的灵活性请求他们需要的数据,以便他们确切地知道返回的数据是什么。这消除了从 REST 端点返回大型有效负载以提取 2-3 个字段的需要。

    GraphQL 服务器是主要枢纽。这是您的 GraphQL 端点代码运行并接收来自用户的请求的地方。一旦收到请求,GraphQL 服务器上运行的代码就会从 GraphQL 服务正在使用的任何数据源中检索数据。这可以是数据库、Web 端点或许多其他不同的选项。它有点类似于传统的基于 Web 的 API 服务器设置。GraphQL 服务的用户倾向于在他们的前端代码中使用 GraphQL 客户端。客户端允许他们轻松地与 GraphQL 服务进行交互,并且还提供了一些我们稍后会谈到的其他好处。

    GraphQL 端点的组件

    模式

    GraphQL 端点是从模式构建的。它是我们 GraphQL 端点的根,也是 GraphQL 服务的核心构建块。模式定义了客户端可以使用的数据。基本模式将概述可用的不同类型(或对象),以及这些类型包含的字段。由此,开发人员可以很容易地看到他们可以使用的东西。GraphQL 模式的示例如下所示:

     type User  {
         id: ID! 
         username: String 
         posts: [Post] 
         comments: [Comment] 
     }
     type Post  {
         id: ID! 
         user: User! 
         text: String! @search 
         comments: [Comment] 
         ratings: [Int] 
         average_rating: Int 
     }
     type Comment  {
         id: ID! 
         post: Post! 
         user: User! 
         text: String! 
     }
                    

    当然,GraphQL 模式还可以支持许多其他功能。它们可以根据需要变得简单或复杂。有关这方面的更多详细信息,您可以在GraphQL Schemas and Types上查看此资源。

    解析器

    定义架构后,您需要将数据源中的数据映射到架构中。这就是 GraphQL 解析器所做的。解析器“解析”数据。正是这种链接填补了用户想要的数据与“如何为用户提供数据”之间的空白。用最简单的术语来说,解析器知道如何获取用户请求的数据。它还格式化数据以适应适当的 GraphQL 响应。通常,这涉及解析器访问数据库、检索所需数据并以 GraphQL 模式中定义的格式将其返回给用户。除了数据库,数据源还可以是解析器调用的第三方 API。您可以阅读GraphQL 查询的执行方式、根类型和解析器函数,以获得更深入的解释。

    GraphQL 是如何使用的?

    GraphQL 通常用于检索或变异数据。这些功能可以通过几种不同的方式完成,并围绕查询、突变和订阅。为了执行这些操作,您需要使用 GraphQL 客户端。GraphQL 客户端允许您的应用程序向您的 GraphQL 服务器发出请求。随着您对该技术越来越熟悉,您可能希望更深入地研究Graph 客户端。有很多选择!

    查询

    您使用 GraphQL查询来检索数据。该查询的工作方式与 SQL 查询非常相似,您可以描述您的条件或过滤您想要检索的数据。这类似于 RESTful 端点上的 GET 请求。与 GraphQL 的不同之处在于,您可以完全灵活地选择要发送和检索的数据。基于上面的模式,下面是一个示例查询,它根据Post类型检索一些数据:

     query {
        queryPost {
          id
          text
        }
     }
                    

    您会注意到语句开头的 query 关键字表示我们正在执行 GraphQL 查询。执行 GraphQL 查询后,用户将收到他们要求的数据(如果存在)。他们只会收到他们要求的字段。不多也不少。返回的数据可能如下所示:

    {
     "data": {
         "queryPost": [
            {
              "id": "0x3dea15a36",
              "text": "Security in web apps"
            },
            {
                query {
                    queryPost {
                        id
                        text
                    }
                }                  
                "id": "0x3dea15a39",
                "text": "A crash course on Webpack"
            },
            {
                "id": "0x3dea15a3a",
                "text": "Top 10 GraphQL tools to make development easier"
            },
            {
                "id": "0x3dea15a3f",
                "text": "GraphQL: A beginner's guide"
            },
            {
                "id": "0x3dea15a47",
                "text": "Making sense of browser compatibility"
            },
            {
                "id": "0x3dea15a49",
                "text": "How Turing machines work"
            }
         ]
       }
     }
                    

    来自 GraphQL 端点的查询结果的美妙之处在于数据以您请求的确切形状返回。因此,开发人员可以获得更可预测的体验。在传统的 RESTful API 中,字段以预定义的响应返回,并且在响应负载方面缺乏自定义。

    突变

    当我们想要更新或删除数据时,我们使用 GraphQL 突变。类似于 RESTful 术语中的 POST 或 PUT,此操作允许我们操作数据。与 POST 或 PUT 不同,GraphQL 突变具有更大的灵活性,并允许以更精细的方式与数据交互。通过突变,可以在数据集中创建或更新一个或多个条目。

    突变请求以突变关键字开头。您还将传递要添加到服务器端数据的数据。根据我们之前看到的查询,这是一个突变在其中添加一些数据的样子:

     mutation {
       addUser(input: [{username: "albert"}]) {
          user {
             username
             id
          }
       }
     }
                

    当突变被执行并完成时,您还可以返回新创建或更新的数据。这很有用,因为它允许我们改变数据,然后返回该数据块以供使用或确认。您可以在一个请求中完成所有这些操作,而不是手动发出后续查询。

    以下是执行上述突变后的响应:

     {
        "data": {
           "addUser": {
              "user": [
                 {
                    "username": "albert",
                    "id": "0x3dea15c60"
                 } 
              ]
           }
        }
     }
                    

    您还可以在单​​个请求中发送多个突变。需要注意的重要一点是它们将按顺序执行。如果我们在一个请求中发送两个突变,在第二个开始之前,第一个保证完成。

    订阅

    订阅是响应数据变化的查询。用户可以通过指定他们想要观看的数据来设置订阅。订阅是在服务器端和客户端定义的。当发生更改时,无论是通过更新还是创建新数据,都会通知订阅者并发送更新的数据。

    请务必谨慎使用订阅。它们不应该用于需要保持数据同步的所有场景。相反,最好简单地轮询数据或根据用户操作(如单击按钮)更新数据。您可能希望应用订阅的一些情况是跟踪大对象中的小变化。与通过订阅订阅更改相比,轮询大对象是资源密集型的并且效率不高。另一个很好的用途是需要低延迟的实时更新,例如通知或实时更新。诸如实时聊天应用之类的东西将从这种类型的使用中受益匪浅。

    它与 REST 相比如何?

    围绕 GraphQL 的许多对话都涉及“GraphQL 与 REST”的前提。我认为很多时候这会导致混乱。这两种技术可以单独使用、一起使用或根本不使用。这不仅仅是一个与另一个的问题。

    然而,使用 REST 来理解 GraphQL 如何适应现代开发堆栈中的方程式是可以接受的。它允许那些不熟悉 GraphQL 的人看到采用的路径。它还展示了 GraphQL 如何解决采用 RESTful API 带来的一些长期存在的问题。

    在典型的 RESTful CRUD 设置中,我们会看到一些技术层。这将包括端点本身,可能还有一些业务逻辑和数据库。每次收到 RESTful 请求时,都需要将其转换或转换为数据库查询。对于每个操作,都需要重复此设置。

    由于 REST 端点通常具有有限的范围,因此需要为应用程序所需的每个操作创建大量端点。这导致了 API 问题。每次我们需要新功能时,我们要么被迫编辑现有的 REST 端点,要么创建一个新端点。这可能会产生许多副作用,包括代码重复、开发人员混乱等等。在更新端点的情况下,这也可能导致端点当前消费者的损坏。

    这就是 GraphQL 真正闪耀的地方。想象一下,您可以在其中查询和更改任何可用数据的单个端点。等待后端团队构建单个 API 的日子已经一去不复返了。

    统一的数据图是我们所有人都应该追求的目标吗?

    这在系统架构方面是一个非常重要的问题。统一数据图的前提是不再拥有单独的数据源和 GraphQL API。相反,所有数据都通过单个接口公开。

    有很多方法可以实现这一点,例如模式拼接和联合。两者都是可以将单个服务组合成单个统一数据图的方式。

    当然,GraphQL 狂热者喜欢通过单个界面公开整个组织的数据的想法。它在易于数据访问方面带来了很多优势。它允许开发人员更快地开发应用程序,而无需搜索他们需要的数据。

    不过也有缺点。包括需要非常全面地考虑的授权和安全问题。这并不像不允许开发人员只能访问他们需要的特定 REST 端点那么简单。

    因此,无需详细说明,这取决于您组织的需求。您存储的数据及其敏感性将决定您是否应该努力通过一个统一的数据图公开所有数据。

    GraphQL 的优缺点是什么?

    像任何技术一样,使用 GraphQL 也有优点和缺点。随着技术的普及,许多缺点正在得到解决。随着时间的推移,随着 GraphQL 的成熟,我相信我们会以某种方式解决大部分缺点。以下是 GraphQL 需要注意的一些优点和缺点:

    优点

    • GraphQL 客户端可以从服务器请求数据并指定响应的格式。

       消除“过度获取”的问题。这是响应包含用户未要求的字段的地方。

    • 在单个请求中检索许多资源。

       这与 REST 不同,我们可能需要多次调用不同的端点来检索我们需要的数据。这也称为“获取不足”。

    • API 是自记录的,因此用户可以准确地看到可用的数据,并知道如何轻松创建请求。

    缺点

    • GraphQL 响应总是返回 200。这与请求是否成功无关。

    • GraphQL 缺乏内置的缓存支持。

       大多数解决方案确实有一些帮助来帮助解决这个问题。

    • GraphQL 会增加复杂性。

       与 GraphQL 相比,具有不太可能更改的数据的简单 REST API 可以更简单地实现和维护。

    • 如果不阻止或停止深度嵌套查询和递归查询,可能会导致服务问题,包括对端点的 DDoS 攻击。

    • 速率限制更棘手,尤其是当所有数据都通过单个 GraphQL 端点公开时。

       使用 REST,您可以对单个端点进行速率限制,但这在 GraphQL 中更难分解

    了解上述一些复杂性后,采用 GraphQL 的决定应该是一个务实的决定。通过查看 GraphQL 在许多小型和大型组织的技术堆栈中的大规模采用,我们可以很容易地看到对开发人员的好处。该技术将继续存在,并且可以成为添加到任何组织工具箱的绝佳工具。

    如何采用 GraphQL?

    与 REST 和其他替代方案相比,GraphQL 提供了极其广泛的选项。有多种方法可以将现有服务转换为 GraphQL,利用现有 RESTful 端点解析 GraphQL 服务中的数据的方法,以及开箱即用支持 GraphQL 的众多平台。您还可以使用框架从头开始构建服务,类似于构建 RESTful 服务的方式。简而言之,采用很容易上手。最困难的部分是弄清楚你想采取什么方法。

    如果您从头开始构建,选择一种语言和框架或库来构建 GraphQL 端点,那么学习曲线可能会很陡峭。这也取决于您正在构建的内容的复杂性。好处是这种方法提供了最多的定制,权衡是启动和运行所需的工作量。