在现代 Web 开发中,RESTful API 是一种非常流行的 Web API 架构风格,它可以使客户端通过 HTTP 协议与服务器进行交互。然而,RESTful API 在一些场景下存在一些不足,这些不足包括缺乏灵活性和效率低下。GraphQL 是由 Facebook 开发的一种数据查询和操作语言,它的出现可以弥补 RESTful API 的这些不足。那么,如何将现有的 RESTful API 转换为 GraphQL 类型呢?本文将介绍如何利用 GraphQL 来访问已有的 RESTful API,并给出一些示例代码。
RESTful API 与 GraphQL 的比较
RESTful API 和 GraphQL 都是用于构建 Web API 的工具,它们有如下不同之处:
数据结构的灵活性
RESTful API 采用固定的数据结构,客户端只能获取服务端返回的完整数据,无法自定义查询数据。而 GraphQL 允许客户端指定想要获取的字段,通过 GraphQL 的解析器,服务端将客户端请求的字段解析为数据库的查询语句,返回符合条件的数据。这种解析器可以完成嵌套的属性查询,也可以在客户端直接组合多个查询。
网络效率
RESTful API 的一个 API 路径只能返回一个 URI 的资源,这意味着客户端必须发送多个 HTTP 请求来获取多个 URI 的资源才能完成一个查询,称为过度获取(over-fetching)。相反,GraphQL 允许客户端请求多个资源并仅返回必要的数据,这称为准确获取(under-fetching)。
版本控制
在 RESTful API 中,客户端只能请求服务端当前发布的版本。版本更新会对客户端造成不必要的负担,可能会导致代码不同步。通过 GraphQL,客户端可以自由选择版本,前端可以根据需要扩展或缩小查询的范围,而无需担心将来发生的服务端变更导致版本不同步。
可扩展性
RESTful API 通常需要额外的文档或代码示例来帮助客户端实现和理解。而 GraphQL 允许通过 introspection 原语自动发现可用架构和查询,这使得从客户端查询到 API 本身成为可能。
如果您已经有了 RESTful API,您可以使用 Apollo Server 来创建一个 GraphQL 服务,作为 RESTful API 的“包装器”以提供更多的灵活性和网络效率。
这里分为三个步骤: 构建 GraphQL Schema、解析查询和调用 RESTful API。
步骤一:构建 GraphQL Schema
首先需要定义 GraphQL Schema,这相当于定义整个 API 的结构。
下面是一个模拟的 RESTful API,它向客户端提供了访问书籍的方式。
const books = [ { id: 1, title: 'The Great Gatsby', author: 'F. Scott Fitzgerald', price: 19.99 }, { id: 2, title: 'To Kill a Mockingbird', author: 'Harper Lee', price: 14.99 }, { id: 3, title: 'The Catcher in the Rye', author: 'J. D. Salinger', price: 16.99 }, ]; app.get('/books', function(req, res) { res.send(books); });
我们可以利用 Apollo Server 根据 RESTful API 构建一个对应的 GraphQL 服务。
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------- ----- -------- - ---- ---- ---- - --- --- ------ ------ ------- ------ ------ ----- - ---- ----- - ------ ------ - -- ----- ------ - --- -------------- --------- --------- --- ----------------------- --- -- -- - --------------- ------ ----- -- --------- ---
这里定义了一个类型 Book
和一个查询类型 Query
,然后将它们传递给一个新的 ApolloServer
实例。
步骤二:解析查询
继续完成查询的解析,返回客户端需要的数据和类型。
-- -------------------- ---- ------- ----- --------- - - ------ - ------------- ----- -------- - ------ ------------------------------------ -------------- -- ---------------- ---------- -- -------------------- - - --
解析查询的方式是通过实现一个 resolvers
对象,这个对象可以使用客户端的查询字段并返回相应的数据。例如,当客户端查询 books
时,resolvers
中的 books
函数会被调用,该函数会根据 RESTful API 的 GET /books
接口获取数据并将其作为 Book
类型的列表返回。
步骤三:调用 RESTful API
由于 RESTful API 已经实现了基本的服务端逻辑,我们只需要将查询转换成合适的 RESTful API 调用,然后解析返回结果即可。
-- -------------------- ---- ------- ----- --------- - - ------ - ----- ------------- ----- -------- - ----- -------- - ----- ------------------------------------- -- -------------- - ----- --- ------------- -- ----- -------- - ----- ----- - ----- ---------------- ------ ---------------- -- -- -------- ----- -------------- -- -- --
这个示例中,我们在 books
解析器函数中发出了一个 GET 请求。当数据返回时,我们映射返回的所有书籍,并添加一个新的属性 type
,这个属性不是从 RESTful API 返回的,而是在 GraphQL 解析器中添加的。这样一来,我们就可以比单独使用 RESTful API 应用程序提供更丰富的数据集。
代码示例
下面我们来看一个完整的例子。
- 首先我们创建一个假的 RESTful API(
server.js
):
const books = [ { id: 1, title: 'The Great Gatsby', author: 'F. Scott Fitzgerald', price: 19.99 }, { id: 2, title: 'To Kill a Mockingbird', author: 'Harper Lee', price: 14.99 }, { id: 3, title: 'The Catcher in the Rye', author: 'J. D. Salinger', price: 16.99 }, ]; app.get('/books', function(req, res) { res.send(books); });
- 在 Apollo Server 中,我们构建一个基于 GraphQL 的 API。
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------- ----- ----- - ---------------------- ----- -------- - ---- ---- ---- - --- --- ------ ------ ------- ------ ------ ----- - ---- ----- - ------ ------ - -- ----- --------- - - ------ - ----- ------------- ----- -------- - ----- -------- - ----- ------------------------------------- -- -------------- - ----- --- ------------- -- ----- -------- - ----- ----- - ----- ---------------- ------ ------ -- -- -- ----- ------ - --- -------------- --------- --------- --- ----------------------- --- -- -- - ------------------- ------- -- --------- ---
使用 ApolloServer
创建了一个 GraphQL 服务,并在 resolvers
中实现了 books
函数来返回 Book
类型的列表。最后启动 Apollo 服务器,并变开放端口 listening。
- 运行 RESTful API 和 GraphQL 服务器。
在命令行界面,输入命令:
node server.js node graphql.js
- 访问 GraphQL API。
在浏览器中打开地址 http://localhost:4000/graphql
。可以看到类似的 GraphQL Playground 页面。在左侧的交互式查询窗口中,尝试输入下列查询:
query { books { id title price } }
这是一个 GraphQL 查询的示例,用于在 RESTful API 中检索可用的所有书籍。该查询将从由 Apollo Server 启动的 GraphQL 服务获取所有符合条件的书籍信息,然后只返回 id
、title
和 price
等属性。
总结
GraphQL 是一个灵活和可扩展的 API 架构,对于实现 RESTful API 整合的系统来说是一个有用的补充。因为 GraphQL 的强大,它可以帮助开发人员实现前端服务的更灵活开发和高效数据查询。在实现 GraphQL 和 RESTful API 相互运作之前,需要仔细考虑您的用例,了解您的数据模型,并为您的前端应用程序的需求考虑 API 架构的可伸缩性。但是无论您的选择是 GraphQL 还是 RESTful API,对于程序员来说,选择适合其需求的技术是至关重要的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6498ff7248841e98945f078e