GraphQL 教程
GraphQL 是 Facebook 开发的一种开源的服务器端技术,用于优化 RESTful API 调用。
GraphQL 是一种执行引擎和一种数据查询语言。
GraphQL为API中的数据提供了一个完整的、可理解的描述。使得用户能够简介准确地请求他们所需要的。
为什么使用 GraphQL
RESTful API 遵循清晰且结构良好的面向资源的方法。然而,当数据变得更复杂时,路由会变得更长。有时无法通过单个请求获取数据。GraphQL就是解决这个问题的。GraphQL 以图的形式构建数据,其强大的查询语法用于遍历、检索和修改数据。
以下是使用 GraphQL 查询语言的优势
请求想要的数据 - 得到数据
向 API 发送 GraphQL 查询并准确获取需要的内容。GraphQL 查询总是返回可预测的结果。使用 GraphQL 的应用程序快速且稳定。与 Restful 服务不同,这些应用程序可以限制应该从服务器获取的数据。
让我们考虑一个具有属性id
、firstName
、lastName
和CollegeName
的业务对象 Student。假设一个移动应用程序只需要获取firstName和id。如果我们设计一个像/api/v1/students
这样的 REST 端点,它最终会为一个学生对象的所有字段获取数据。这意味着,数据被 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,它具有以下属性:name
和 location
。该学生的业务对象具有 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 还提供了客户端库,可以帮助减少显式数据转换和解析。
下面给出了Student和College数据类型的示例
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 和智能代码完成功能。
学习本教程前你需要了解
本教程是基于 NodeJs 和 Express。所以,如果你对 NodeJS 有基本的了解,那么学习 GraphQL 会很容易。对于 GraphQL 的前端集成,我们将使用 ReactJs 和 Jquery。由于本教程中的插图使用的是 EcmaScript 6 (ES6) 语法,因此对ES6 有所了解也是会有所帮助的。