想在业务或企业环境中试用 GraphQL?这样做既有优点,也有缺点。
GraphQL 的优点
-
GraphQL 模式会在 GraphQL 应用中设置单一事实来源。它为企业提供了一种整合其整个 API 的方法。
-
一次往返通讯可以处理多个 GraphQL 调用。客户端可得到自己所请求的内容,不会超量。
-
严格定义的数据类型可减少客户端与服务器之间的通信错误。
-
GraphQL 具有自检功能。客户端可以请求一个可用数据类型的列表。这非常适合文档的自动生成。
-
GraphQL 允许应用 API 进行更新优化,而无需破坏现有查询。
-
许多开源 GraphQL 扩展可提供 REST API 所不具备的功能。
-
GraphQL 不指定特定的
应用架构
。它能够以现有的 REST API 为基础,并与现有的
API 管理
工具配合使用。
GraphQL 的缺点
-
即便是熟悉 REST API 的开发人员,也需要一定时间才能掌握 GraphQL。
-
GraphQL 将数据查询的大部分工作都转移到服务器端,由此增加了服务器开发人员工作的复杂度。
-
根据不同的实施方式,GraphQL 可能需要不同于 REST API 的 API 管理策略,尤其是在考虑速率限制和定价的情况下。
-
缓存机制比 REST 更加复杂。
-
API 维护人员还会面临编写可维护 GraphQL 模式的额外任务。
GraphQL 查询示例
想要更好地了解 GraphQL,最好的办法就是看一些查询和响应的示例。我们来看看来自 GraphQL 项目网站
graphql.org
的 3 个示例。
第一个示例显示了客户端如何构建 GraphQL 查询,从而要求 API 以指定的形态返回特定字段。
{
}
GraphQL API 将以 JSON 格式返回如下结果:
{
"me": {
"name": "Dorothy"
}
客户端也可以作为 GraphQL 查询的一部分来传递参数,如下例所示:
{
human(id: "1000") {
location
}
结果为:
{
"data": {
"human": {
"name": "Dorothy,
"location": "Kansas"
}
从这里开始,事情变得更加有趣。GraphQL 允许用户定义可复用的片段并分配变量。
假设您需要请求一个 ID 列表,然后为每个 ID 请求一系列记录。借助 GraphQL,您可以构建一个查询,然后通过单个 API 调用来提取所需的所有内容。
查询方式如下:
query HeroComparison($first: Int = 3) {
leftComparison: hero(location: KANSAS) {
...comparisonFields
rightComparison: hero(location: OZ) {
...comparisonFields
fragment comparisonFields on Character {
friendsConnection(first: $first) {
totalCount
edges {
node {
}
可能生成以下结果:
{
"data": {
"leftComparison": {
"name": "Dorothy",
"friendsConnection": {
"totalCount": 4,
"edges": [
"node": {
"name": "Aunt Em"
"node": {
"name": "Uncle Henry"
"node": {
"name": "Toto"
"rightComparison": {
"name": "Wizard",
"friendsConnection": {
"totalCount": 3,
"edges": [
"node": {
"name": "Scarecrow"
"node": {
"name": "Tin Man"
"node": {
"name": "Lion"
如果您是 GitHub 用户,那么使用
GitHub 的 GraphQL Explorer
就能快速上手 GraphQL。