25

GraphQL 值得了解一下

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzA4Nzc4MjI4MQ%3D%3D&%3Bmid=2652404013&%3Bidx=1&%3Bsn=a259af0c9cd667ea860801aabb97dbc3
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
yAzIj2B.jpg!mobile

欢迎阅读 :clap:

本文会通过实际场景介绍一下 GraphQL,目的是让你快速了解 GraphQL 是什么,以及基本工作思路,不包含实际用法,所以阅读很轻松。

1. GraphQL 是什么?

GraphQL 是后端数据查询语言,可以简单理解为 GraphQL 对标的是 REST 接口。

GraphQL 由 Facebook 开源,目前已经在 Facebook 中支撑千亿级的 API 接口调用,在 Facebook 之外正在被迅速应用。

我们不要被 GraphQL 这个名字误导了,第一次看见它时,我还以为这是一个图数据库的查询语言呢。

GraphQL 大体上的确是 "图查询" 的意思,但这个 "图" 是 数据图谱 的意思,不是图数据库。

2. GraphQL 思路

aieqmu2.jpg!mobile

以上图为例,这是主流的 Feed 流形式,如何实现呢?

定下来界面中需要显示哪些数据元素之后,后端开始为其定制一个 REST 接口,查询出相关数据:

  • Post 帖子

  • 作者

  • Like 喜欢

  • Comment 评论

  • Share 分享

后端程序员进行数据关联查询,取出其中需要的数据项,然后封装为一个易于前端操作的数据结构,例如 JSON 对象。

这样 Feed 流的接口就 OK 了,同样的,对于其他界面再进行相应的接口开发。

例如在帖子详情页面,涉及的数据还是 Feed 流中的这些,但具体的数据项不同了,例如:

  • 帖子需要全文

  • Like 需要点赞用户的图像列表、ID

  • Comment 评论需要详情列表

因为数据项的不同,就需要针对这个界面需求重新开发吧。

如果你嫌麻烦,提供了一个大而全的接口,后端开发是简单了,但新问题来了,例如:

  • 前端开发需要从结果数据中仔细挑出自己所需要的数据项。

  • 接口返回数据中包含大量的前端无用数据,会占用更多的带宽,影响性能,例如 Facebook 那种千亿级的 API 调用量,这种带宽的浪费是不能容忍的。

有什么更好的办法呢?( 如果你有更好的经验,欢迎发给我,我会分享给大家

Facebook 为了解决这个问题,设计出了 GraphQL。

GraphQL 解决思路

对于上述场景,本质上是后端在应付前端的每个需求,是以前端需求为中心。

前端说我要这些数据,后端就去准备这些数据,来一个需求就处理一个需求。

Facebook 的想法是:

数据就是那样的,每个数据对象包含哪些项,根据各个数据对象的关系就可以形成数据的图谱了。

后端负责构造这个数据图谱,前端根据数据图谱来查询自己所需要的数据。

这样前端与后端都是以数据图谱为中心了,后端就不用伺候前端各种不同类型的需求了,前端也可以自由的精准查询数据了。

感觉比较抽象是吧,看下面的示例代码:

# ----------- 定义数据类型 ----------- 
type Post {
id: String!
title: String!
description: String
comments: [Comment]
likes:[Like]
}

type Comment{
id:String
}

type Like{
id:String
}


# ----------- 定义查询接口 -----------
type Query {
recentPosts(count: Int, offset: Int): [Post]!
}

type Mutation {
writePost(title: String!, category: String) : Post!
}

(上面代码可横向滑动)

其中分为2个部分:

  • 上面部分定义了数据类型,例如 Post,指明包含哪些数据项,其中的 commentslikes 关联了其他的数据类型,这样就描绘出了数据对象之间的关系。
  • 下面部分定义了查询接口,供前端调用。

然后我们看前端怎么用。

Vjqieub.jpg!mobile

上图中,左边是前端的调用方式,右边是返回的数据结果。

前端调用了 recentPosts 接口,并指明了只需要返回 id ,所以,返回结果中只有 id 数据项。

Bbm2ymA.jpg!mobile

上图中,前端调用了 recentPosts 接口,这次指明了需要:

  • Post 的 id 项

  • likes 的 id 项

  • comments 的 id 项

在右边的返回结果中可以看到,应前端的需求返回了相应数据。

3. 小结

在以数据图谱为中心之后,后端省心了,前端自由了。所以 GraphQL 的核心就是构建好这个数据图谱。

以上就是 GraphQL 基本内容了,如果对它有兴趣,可以留言告诉我,之后我会整理一个 GraphQL 的使用教程。

本文参考资料:

https://medium.com/javarevisited/basic-functionalities-of-graphql-every-developer-should-know-71347d7fab08

Happy Learning ヾ( ̄▽ ̄)Bye~Bye~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK