GraphQL - 简介

GraphQL 是一种开源服务器端技术,由 Facebook 开发,用于优化 RESTful API 调用。它是一个执行引擎和数据查询语言。在本章中,我们讨论使用 GraphQL 的优势。

为什么选择 GraphQL

RESTful API 遵循清晰且结构良好的面向资源的方法。但是,当数据变得更复杂时,路由会变得更长。有时无法通过单个请求获取数据。这就是 GraphQL 派上用场的地方。GraphQL 以图形的形式构造数据,其强大的查询语法可用于遍历、检索和修改数据。

以下是使用 GraphQL 查询语言的优势 −

提出您的需求 −并获取它

向您的 API 发送 GraphQL 查询并获取您所需的内容。GraphQL 查询始终返回可预测的结果。使用 GraphQL 的应用程序快速且稳定。与 Restful 服务不同,这些应用程序可以限制应从服务器获取的数据。

以下示例将帮助您更好地理解这一点 −

让我们考虑一个业务对象 Student,其属性为 id、firstName、lastNamecollegeName。假设移动应用程序只需要获取 firstNameid。如果我们设计一个 REST 端点,如 /api/v1/students,它最终将获取 student 对象的所有字段的数据。这意味着,RESTful 服务过度获取了数据。这个问题可以通过使用 GraphQL 来解决。

考虑下面给出的 GraphQL 查询 −

{
   students {
      id
      firstName
   }
}

这将仅返回 id 和 firstname 字段的值。查询不会获取 student 对象其他属性的值。上面所示的查询的响应如下所示 −

{
   "data": {
      "students": [
         {
            "id": "S1001",
            "firstName": "Mohtashim"
         },
         {
            "id": "S1002",
            "firstName": "Kannan"
         }
      ]
   }
}

通过单个请求获取许多资源

GraphQL 查询有助于顺利检索关联的业务对象,而典型的 REST API 需要从多个 URL 加载。GraphQL API 通过单个请求获取应用程序所需的所有数据。使用 GraphQL 的应用程序即使在较慢的移动网络连接上也可以快速运行。

让我们再考虑一个业务对象 College,它具有以下属性:名称和位置。Student 业务对象与 College 对象具有关联关系。如果我们要使用 REST API 来获取学生及其大学的详细信息,我们最终将向服务器发出两个请求,如 /api/v1/students/api/v1/colleges。这将导致每次请求的数据获取不足。因此,移动应用程序被迫多次调用服务器以获取所需数据。

但是,移动应用程序可以使用 GraphQL 在单个请求中获取 Student 和 College 对象的详细信息。

以下是用于获取数据的 GraphQL 查询 −

{
   students{
      id
      firstName
      lastName
      college{
         name
         location
      }
   }
}

上述查询的输出恰好包含我们请求的那些字段,如下所示 −

{
   "data": {
      "students": [
         {
            "id": "S1001",
            "firstName": "Mohtashim",
            "lastName": "Mohammad",
            "college": {
               "name": "CUSAT",
               "location": "Kerala"
            }
         },
         
         {
            "id": "S1002",
            "firstName": "Kannan",
            "lastName": "Sudhakaran",
            "college": {
               "name": "AMU",
               "location": "Uttar Pradesh"
            }
         },
         
         {
            "id": "S1003",
            "firstName": "Kiran",
            "lastName": "Panigrahi",
            "college": {
               "name": "AMU",
               "location": "Uttar Pradesh"
            }
         }
      ]
   }
}

描述类型系统的可能性

GraphQL 是强类型的,查询基于字段及其相关数据类型。如果 GraphQL 查询中存在类型不匹配,服务器应用程序将返回清晰有用的错误消息。这有助于顺利调试并让客户端应用程序轻松检测错误。GraphQL 还提供了客户端库,可帮助减少显式数据转换和解析。

下面给出了 StudentCollege 数据类型的示例 −

type Query {
   students:[Student]
}

type Student {
   id:ID!
   firstName:String
   lastName:String
   fullName:String
   college:College
}

type College {
   id:ID!
   name:String
   location:String
   rating:Float
   students:[Student]
}

借助强大的开发人员工具加快速度

GraphQL 提供了丰富的开发人员工具来记录和测试查询。GraphiQL 是一款出色的工具,可生成查询及其架构的文档。它还提供了一个查询编辑器来测试 GraphQL API 和智能代码完成功能,同时构建查询。