RESTful API 是很多 Web 开发人员都熟悉的技术,它是一种协议,用于处理客户端和服务器之间数据的传输。但是随着应用需求变得更加复杂,RESTful 的局限性已经变得越来越明显了,这时需要一种更现代化的 API 语言,那就是 GraphQL。
GraphQL 是一种由 Facebook 开源的 API 语言,它可以理解为是一种数据查询语言。与 RESTful 不同的是,GraphQL 提供了更丰富的查询语言,同时也允许客户端请求和服务器的对话、交互更为灵活,并且没有 REST 的缺陷和限制。接下来,我们将详细介绍 GraphQL 相对于 REST 的优点。
1. 更灵活的查询方式
RESTful API 只支持基于资源路径的查询,而 GraphQL 更强大,它允许客户端根据自己的需要灵活查询需要的数据,而不需要多次请求多个端点数据。这主要得益于 GraphQL 的查询语言,拥有类似 JSON 的语法,使用者可以直接从不同服务器上的多个表中获取数据。
下面我们通过一个例子来说明 GraphQL 的查询方式的灵活性:
-- -------------------- ---- ------- ----- - -------- -- - ---- --- ------- - ---- ------- - - -
这个查询语句能够在一个请求中返回用户 id 为 1 的所有信息,包括公司信息。相对而言,在 RESTful API 中实现这个查询语句需要多次请求,对性能和开发效率都有不小的影响。
2. 有效减少数据传输
RESTful API 通常返回所有请求的整个结果集,而 GraphQL 可以根据客户端的具体请求,返回更少的数据,减少了传输数据的大小。这意味着更快的加载速度和更低的带宽消耗。
下面我们来看一个例子:
传统 RESTful API 查询所有公司信息:
https://localhost:3000/companies
GraphQL 查询所有公司名称和地址:
query { companies { name address } }
可以看出,GraphQL 只返回了所需的数据,而 RESTful API 返回了所有数据,当数据规模庞大时差别愈发明显。
3. 一次请求获取多个资源
在 RESTful API 中,如果需要从多个不同的端点获取数据,则需要多次请求。而 GraphQL 允许你从连个或多个不同端点中获取数据,这可以避免多次网络请求。
比如说,我们需要从链接数据库的两张表中分别获取数据,那么在 RESTful API 中需要分别请求这两张表的数据,而在 GraphQL 中则可以通过以下查询方式获得:
-- -------------------- ---- ------- ----- - -------- -- - ---- --- ------- - ---- ------- --------- - ---- - - - -
这个查询有效的完成了一次查询同时获取了用户、公司和该公司的所有员工信息,而只使用一次网络请求。
4. 更易于版本管理
在 RESTful API 中,每个资源都有一个特定的 uri 地址,如果需要修改任何一个资源,则必须使用不同的 uri。这很可能会导致大量的混乱,而 GraphQL 更易于进行版本管理。
在 GraphQL 中,我们对客户端暴露的 schema 进行版本管理,可以确保 API 的所有调用都是被授权的。在更新 API 时,只需升级 schema,并为此后的所有操作添加相应的字段即可,而不需要重新考虑 URI 的配对问题。
5. 安全检查
在 RESTful API 中,通常需要使用幂等和状态代码等特定方法来确保安全访问,而GraphQL 则通过查询和变异来支持这些安全检查,因此无需保留 API 中复杂的设计方式。
GraphQL 查询方式可以大大降低 HTTP 方法的使用难度,并帮助开发人员领悟 GraphQL API 实现的各种安全规则,提高正常操作的效率。
6. 持续发展
GraphQL 作为一种新的技术,它的更新速度和功能丰富程度超过了 RESTful API。在 Facebook 的支持下,GraphQL 受到越来越广泛的关注,生态系统日益完善,适用性逐渐扩大。
总结
综上所述,GraphQL 相对于传统的 RESTful API 更加先进、更加灵活、更高效,并且具有更高的发展潜力。也许在短期内,这些优点对于一些简单的应用将不会立刻体现出来,但当应用变得更加复杂、需求变得更为严苛时,GraphQL 的优点将变得更加明显,GraphQL 也将成为应用开发的重要选择。
示例代码
下列代码比较了一个使用 RESTful API 和 GraphQL API 获取的相同数据,并且考虑了许多上述优点。
REST 方案:
-- -------------------- ---- ------- ----------------------------- ----- ---- -- - ----- ------ - --------------------- ----- - ------ ----- - - ---------- -- --- ---- ----- ---- ------------------------------------------------------------ -- - -- --- ---- ------- ---- -------------------------------------------------- - ------- ------- ----- ---------------- ------ ----- --- -------- - --------------- ------------------ - ----------------- -- - -- --- ------ ------- ----- --------- - -------------------- -- ----------- ----- -------- - ------------------------ -- ---------------------------------------------------- ------------------------------------------ -- - ----- ------ - - ----- - --- -------- ----- ---------- ---- --------- -- -------- -------------------------- -- -- --- ---------- ----- ------------ ---- ----------- ---- -- ----------------- --- --- --- ---
GraphQL 方案:
-- -------------------- ---- ------- -- -- ------- ------ ----- ------ - ------------- ---- ---- - --- -- ----- ------ ---- --- -------------- ---- ------ ----- ------ - ---- ----- - -------- ---- ---- - --- -- -- -------- -- ----- ---- - - ----- ------ -- - ----- ------ - -------- ------ ------------------------------------------------------------ -- - ------------ - -- ------ ------- -- - ------ -------------------------------------------------- - ------- ------- ----- ---------------- ------ ----- --- -------- - --------------- ------------------ - ----------------- -- - ----- ------------- - ---------------------- -- - ------ --------------------------------------------------- --- ------ ---------------------------------------- -- - ------ ------------------- -- -- --- ---------- ----- ------------ ---- ----------- ---- --- --- -- ------ ----- --- -- -- -- -- ------- -- ----- --- - ---------- ------------------- ------------- ------- ------- ---------- ----- --------- ----- ----
可以看出 GraphQL 方式具有更清晰易读的代码,相比第一个方案也更加高效、灵活、泛用性强,可扩展性好。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b384ea48841e9894fcbd56