• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

Github GraphQL 介绍

JAVA web前端中文站 2年前 (2017-07-05) 836次浏览 已收录 0个评论

现在我越来越意识到英语的重要性了。很多知识点缺少中文资料,而英文却有很多博文。希望人工智能在这方面能帮到我。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

GitHub 宣布开放了一套使用 GraphQL 开发的公共 API。

GitHub 的 REST API 已经非常完善,设计得很优秀,很多公司开发自己的 REST API 时都会参考 GitHub,也有很多爱好者写了非常丰富的教程。

GraphQL 的核心是一套数据查询语言的规范,是 Facebook 在 2012 年开发的,2015 年开源,Facebook 内部已经广泛应用,用于替代 REST。

GitHub 为什么选择 GraphQL?这是很多用户关心的问题,Github 对此做了解释。

REST API

首要问题就是扩展性方面,随着 API 的不断发展,会变得越来越臃肿

REST API 的方式是:server 定义一系列的接口,client 调用自己需要的接口,获取目标数据进行整合

例如用户接口,刚开始时,返回的信息会比较少,例如只有 id,name

后来用户的信息增加了,就在用户接口中返回更多的信息,例如 id,name,age,city,addr,email,headimage,nick

但可能很多 client 只是想获取其中少部分信息,如 name,headimage,却必须得到所有的用户信息,然后从中提取自己想要的

这个情况会增加网络传输量,并且不便于 client 处理数据

还有一个不方便的地方,例如 client 在某个需求中,可能需要调用多个独立的 API 才能获取到足够的数据

例如 client 要显示一篇文章的内容,同时要显示评论、作者信息,那么就可能需要调用文章接口、评论接口、用户接口

这种方式非常不灵活

GitHub 还遇到其他一些 REST API 不好处理的问题,例如

想要确保 client 提供的参数的类型安全;想要从代码生成文档;想要识别每个端点的 OAuth 请求范围等。

GraphQL

GraphQL 简单来说就是:取哪些数据是由 client 来决定

REST 中,给哪些数据是 server 决定的,client 只能从中挑选,如果 A 接口中的数据不够,再请求 B 接口,然后从他们返回的数据中挑出自己需要的

GraphQL 中,client 直接对 server 说想要什么数据,server 负责精确的返回目标数据

例如,你想要获取用户的几个属性信息,你的 GraphQL 请求就是这样的

 {  viewer {    login    bio    location    isBountyHunter  } }

返回的响应信息如下

 {  "data": {    "viewer": {      "login": "octocat",      "bio": "I've been around the world, from London to the Bay.",      "location": "San Francisco, CA",      "isBountyHunter": true    }  } }

再看一个更复杂的例子,例如你想知道你给多少个项目点亮过星星、最初 3 个项目的名字、及他们 star fork watcher 的总数可以看到,返回的 JSON 数据中,key value 是和请求完全一致的

GraphQL 请求就是这样的。

 {  viewer {    login    starredRepositories {      totalCount    }    repositories(first: 3) {      edges {        node {          name          stargazers {            totalCount          }          forks {            totalCount          }          watchers {            totalCount          }          issues(states:[OPEN]) {            totalCount          }        }      }    }  } }

响应信息如下

 {    "data":{      "viewer":{        "login": "octocat",      "starredRepositories": {        "totalCount": 131      },      "repositories":{        "edges":[          {            "node":{              "name":"octokit.rb",              "stargazers":{                "totalCount": 17              },              "forks":{                "totalCount": 3              },              "watchers":{                "totalCount": 3              },              "issues": {                "totalCount": 1              }            }          },          {              "node":{                "name":"octokit.objc",              "stargazers":{                "totalCount": 2              },              "forks":{                "totalCount": 0              },              "watchers":{                "totalCount": 1              },              "issues": {                "totalCount": 10              }            }          },          {            "node":{              "name":"octokit.net",              "stargazers":{                "totalCount": 19              },              "forks":{                "totalCount": 7              },              "watchers":{                "totalCount": 3              },              "issues": {                "totalCount": 4              }            }          }        ]      }    }  } }

GraphQL 还有很多其他的特点,例如你只需要一个请求,就可以得到所有需要的数据。

  • 批量请求,可以定义两个独立请求的依赖关系,高效的获取数据
  • 创建订阅,client 可以收到新的数据
  • 数据延迟,可以对响应中一部分数据标识为时间不敏感

不只是 Github,还有很多大公司已经使用 GraphQL,例如 Pinterest, Coursera, Shopify。
Github 也表达了对 GraphQL API 的重视,接下来会持续完善,使其更加灵活。

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Github GraphQL 介绍
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址