Github 为什么开放了一套 GraphQL 版本的 API
发布网友
发布时间:2022-04-24 05:54
我来回答
共3个回答
懂视网
时间:2022-05-12 03:32
GraphQL是一种新的API标准,本质是一个用于 API 的查询语言;它提供了一种高效、强大和灵活的数据查询方式。下面本篇文章就来带大家了解一下GraphQL,介绍GraphQL的优点和缺点,希望对大家有所帮助。
GraphQL是什么?
GraphQL是直接为不同的API创建的,一个用于 API 的数据查询语言,一种新的API标准,一个执行引擎。它主要目的是使用简单描述数据需求和交互的灵活语法和系统。
GraphQL的优点和缺点
没有人可以说工具是完全完美的。当您考虑开始使用GraphQL时,最好了解它的优点和缺点。
优点
1、请求并得到所要的数据
将GraphQL查询发送到您的API并获得您需要的内容;GraphQL查询始终返回可预测的结果;使用GraphQL的应用程序快速而稳定。
2、在单个请求中获取许多资源
GraphQL 询不仅能够获得资源的属性,还能沿着资源间引用进一步查询。GraphQL 可以通过一次请求就获取你应用所需的所有数据。这样一来,即使是比较慢的移动网络连接下,使用 GraphQL 的应用也能表现得足够迅速。
3、描述类型系统的可能性
GraphQL是强类型的,查询基于字段及其关联的数据类型。如果GraphQL查询中存在类型不匹配,则服务器应用程序将返回明确且有用的错误消息。这有助于客户端应用程序顺利调试和轻松检测错误。GraphQL还提供了客户端库,可以帮助减少显式数据转换和解析。
4、功能强大的开发人员工具
GraphQL为文档和测试查询提供了丰富的开发人员工具。GraphiQL是一个出色的工具,可以生成查询及其模式的文档。它还提供了一个查询编辑器,用于在构建查询时测试GraphQL API和智能代码完成功能。
5、开发时间较短。
使用GraphQL的一个主要好处是,可以更快地完成一些开发工作。例如,代替编写巨大的代码文本,仅使用一个或两个主要功能来实现您的需求就足够了。
缺点
GraphQL缺乏适当的中间件结构。这可以通过将其划分为不同的方案来解决。可以创建API,以便根据需要关闭的中间件对功能进行分组,但许多方案不是最佳选择。
当然,如果整个项目功能紧凑,开发过程就不会停滞不前。请记住,您可能必须处理此类问题。
另一件事是bug的问题。我们必须承认并记住,在开发过程中,如果面临几个严重且有害的错误,这将导致无法正确管理API。
热心网友
时间:2022-05-12 00:40
背景
GitHub 宣布开放了一套使用 GraphQL 开发的公共 API。
GitHub 的 REST API 已经非常完善,设计得很优秀,很多公司开发自己的 REST API 时都会参考 GitHub,也有很多爱好者写了非常丰富的教程。
GraphQL 的核心是一套数据查询语言的规范,是 * 在2012年开发的,2015年开源,* 内部已经广泛应用,用于替代 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 的重视,接下来会持续完善,使其更加灵活
热心网友
时间:2022-05-12 01:58
因为graphql就是未来...