Github 为什么开放了一套 GraphQL 版本的 API?

简介:

背景

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 可以收到新的数据

数据延迟,可以对响应中一部分数据标识为时间不敏感

文章转载自 开源中国社区 [http://www.oschina.net]

目录
相关文章
|
13天前
|
网络协议 API
检测指定TCP端口开放状态免费API接口教程
该API用于检测目标主机指定TCP端口是否开放,适用于检测连通状态等场景。支持指定大陆、美国、香港等检测节点。请求地址为 `https://cn.apihz.cn/api/wangzhan/port.php`,支持POST和GET请求方式。请求参数包括 `id`、`key`、`type`、`host` 和 `port`。返回参数包含检测结果和状态码。示例请求:`https://cn.apihz.cn/api/wangzhan/port.php?id=88888888&key=88888888&type=1&host=49.234.56.78&port=80`。
|
25天前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
25天前
|
前端开发 JavaScript API
探索GraphQL:如何构建高效的数据API
【10月更文挑战第25天】在现代Web开发中,API的效率和灵活性至关重要。本文探讨了如何利用GraphQL构建高效的数据API。GraphQL通过声明式查询方式,允许客户端精确指定所需数据,减少数据传输量,提高API效率。文章介绍了设置GraphQL服务器、设计API Schema、实现解析函数及调整前后端交互的具体步骤,展示了GraphQL的优势和应用场景。
33 2
|
1月前
|
缓存 监控 前端开发
利用GraphQL提升API开发效率
【10月更文挑战第10天】本文介绍了GraphQL的核心概念、优势及其实现步骤,探讨了其在现代开发中的应用,包括动态数据需求、单页应用和微服务架构。通过缓存策略、批处理、安全性和监控等实战技巧,提升API开发效率和用户体验。
|
1月前
|
安全 API 数据库
掌握GraphQL:现代API开发的新选择
【10月更文挑战第1天】在传统RESTful API显现出局限性后,GraphQL作为新型API查询语言和运行时,提供更灵活的数据获取方式。客户端可精确指定所需数据结构,减少传输量并提升效率。本文探讨GraphQL核心概念、优势及实施方法。尽管存在复杂性和性能优化等挑战,GraphQL仍是构建现代API的强大工具。
|
2月前
|
API 网络架构 微服务
探索 GraphQL:现代 API 开发的新范式
GraphQL 是一种高效的 API 查询语言,允许客户端精确请求所需数据,避免了传统 RESTful API 中的数据冗余问题。它由 Facebook 开发并开源,现广泛应用于现代 Web 和移动应用。本文将介绍 GraphQL 的核心概念、优势及其在不同场景下的应用,并指导你如何构建和优化 GraphQL API。
|
3月前
|
Java Spring API
Spring框架与GraphQL的史诗级碰撞:颠覆传统,重塑API开发的未来传奇!
【8月更文挑战第31天】《Spring框架与GraphQL:构建现代API》介绍了如何结合Spring框架与GraphQL构建高效、灵活的API。首先通过引入`spring-boot-starter-data-graphql`等依赖支持GraphQL,然后定义查询和类型,利用`@GraphQLQuery`等注解实现具体功能。Spring的依赖注入和事务管理进一步增强了GraphQL服务的能力。示例展示了从查询到突变的具体实现,证明了Spring与GraphQL结合的强大潜力,适合现代API设计与开发。
137 0
|
3月前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之海外是否可以访问人物动漫化的api版本
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
51 0
|
3月前
|
数据采集 JSON 小程序
零成本 API 服务搭建,用 GitHub Actions 自动爬取文章?
本着将成本降到最低,我目前做的应用或小程序都是单机的,也就是不用请求接口,只要一上架就没有任何支出。但是写死的数据毕竟有限,应用的内容单一无法紧跟时事热点,每次打开一个样,自然就没有留存。遇到有错字啥还要更新版本,那有没有方法既能丰富应用内容,又不用增加成本呢?
34 0
|
3月前
|
人工智能 自然语言处理 API
云栖发布:通义听悟AI能力再进化,开放API接口
云栖发布:通义听悟AI能力再进化,开放API接口
下一篇
无影云桌面