- By test - In 中国vs巴西世界杯
一文看懂 GraphQL 是什么?都有哪些优缺点
想在业务或企业环境中试用 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 以指定的形态返回特定字段。
{
me {
name
}
}GraphQL API 将以 JSON 格式返回如下结果:
{
"me": {
"name": "Dorothy"
}
}客户端也可以作为 GraphQL 查询的一部分来传递参数,如下例所示:
{
human(id: "1000") {
name
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 {
name
friendsConnection(first: $first) {
totalCount
edges {
node {
name
}
}
}
}可能生成以下结果:
{
"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。