在本文中,我们将讨论GitHub的REST API不够高效以及GitHub的GraphQL API如何帮助我们解决问题的情况。
在进行Git Repository Analyzer项目时,我们广泛使用了Octokit的GitHub REST API客户端。 Node.js异步调用的使用有助于同时进行HTTP调用,但是为了获取所需数据而进行的HTTP调用过多。 让我们看看如何使用GitHub的GraphQL API克服问题。
资料需求
- 根据搜索参数搜索GitHub存储库; 例如language:java 。
- 按照在存储库中发现的星数降序对这些存储库进行排序。
- 对于每个存储库,获取前30个拉取请求。
- 对于每个拉取请求,获取问题和补丁/差异数据。 发出数据和补丁数据可以通过进行2个单独的HTTP调用来获取。 补丁是一个小文件,指示存储库中已更改的内容。
使用GitHub REST API v3
基于上述要求,我们以以下方式检索数据。
问题
让我们看一下上述方法面临的问题:
- HTTP调用次数
假设我想从5个GitHub存储库中获取所需的数据。
- 一个HTTP调用,用于获取存储库详细信息(计数:1)
- 对于每个存储库,我们获得30个拉取请求数据(计数:5)
- 对于每个拉取请求,我们进行1个HTTP调用以获取拉取请求的Issue数据(计数:30 * 5 = 150)
- 对于每个请求请求,我们进行1个HTTP调用,以获取请求请求的补丁/差异数据(计数:30 * 5 = 150)
我们总共进行306次HTTP 调用 ,以基于搜索查询获取5个存储库的Issue和Patch数据。
- 删除未使用的数据
在每个HTTP调用之后,响应中只有很少的字段用于后续调用。 为了减小最终输出的大小,有必要从响应中删除未使用的数据。
什么是GraphQL?
从graphql.org :
GraphQL为您的API中的数据提供了完整且易于理解的描述,使客户能够准确地询问他们所需的内容,仅此而已,使随着时间的推移更容易开发API,并启用了功能强大的开发人员工具。
为什么要使用GitHub的GraphQL API?
- 大幅减少HTTP调用
在上述情况下,当我们使用GitHub的REST API时,我们进行了306次HTTP调用以检索数据。 现在,只需很少的HTTP调用即可接收所有这些数据。 在下一篇文章中,我们将看到HTTP调用的确切计数以及有关实现的详细信息。
- 仅获取必填字段
我们仅收到我们要求的数据-仅此而已。 我们不再需要删除未使用的数据。
- 单端点
我们不再需要使用其他URL(以REST API调用为例)来检索数据。 GraphQL具有单个端点,该端点独立于所需数据。
当前,GitHub的GraphQL API不支持上述用例。 已出于相同目的提出了请求 。
最初于 2018年8月18日 发布在 https://www.linkedin.com 。
From: https://hackernoon.com/why-i-felt-the-need-to-use-graphql-b451d16e7369