一起走进GraphQL
Posted JAD DESIGN
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起走进GraphQL相关的知识,希望对你有一定的参考价值。
什么是GraphQL?
GraphQL 是一种面向数据的 API 查询语言(规范),是一种协议而非存储。GraphQL对你的API中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余。
GraphQL由Facebook发起,其手机客户端自2012年起,就全面采用了GraphQL查询语言, 2015年, Facebook全面开源了第一份GraphQL规范。到目前为止,在Twitter,Github,Pinterest,Shopify等大型网站也得到了广泛的实践。语言也从最初的js,扩展到java ,python,Go。
强类型语言
其实GraphQL所需要学习的语法很少,大部分语法与我们平时的语法一致,可以通过官网详细了解 https://graphql.cn。 可以自己实现增删改查等操作。需要特别注意的是,GraphQL是一门强类型语言,我们需要定义每一个属性的类型。如下图所示:
下面是一个简单的类型定义,先是定义了一个枚举,然后我们定义了一个类型,类型中有四个属性:id、 name、 friends、 appearsIn,其中id和name是标量类型,而friends是一个Person类型。
enum Episode {
NEWHOPE
EMPIRE
JEDI
}
type Person{
id: ID!
name: String!
friends: [Person]
appearsIn: [Episode]!
}
核心概念
Schema可以说是GraphQL最具核心的部分,其描述了整个接口向外暴露的形式。
像Restful API,我们会定义一个查询所有人的接口url定义为:/api/v1/user/getUsers
查询人具体信息的接口url为:/api/v1/user/getUserById
新增一个人员的接口url定义为:/api/v1/user/createUser
这样前端人员调用起来会很直观。
但是graphql是完全不一样的使用方式,其向前端暴露的url就一个像/api/graphql之类的,那这么多接口怎么区分呢?我们来看看:
奥妙就是上面这张图,一个graphql接口都有一个Schema定义。
其定义三种操作方式:query(查询),mutation(变更)和subscription(监听)。
再往下延伸,一个查询中包含多个field,也就是多种不同的查询,比如query user查询人,query message查询消息,query weather查询天气。
通过这些就实现了Restful API使用多个url来达到不同操作的效果。
GraphQL和传统REST相比有什么不同?
相同点:
两者都有资源的概念,并可以为这些资源指定ID。
两者都可以通过HTTP GET请求获取URL。
两者都可以在请求中返回JSON数据。
不同点:
在REST中,您调用的端点是该对象的标识。在GraphQL中,标识与获取它的方式是分开的。
在REST中,资源的类型和大小由服务器决定。在GraphQL中,服务器声明哪些资源可用,客户端询问它需要什么
GraphQL的优点和缺点
优点:
可以通过请求控制返回的数据。
减少网络请求次数。可以通过一个资源入口访问到关联的其他资源,只要事先在schema中定义好资源之间的关系即可,传输不一样的数据,而REST则提供多个URL端点来获取相关的资源。
参数类型强检验。REST方案本身没有对参数的类型做规定,往往都需要自行实现参数的校验机制,以确保安全。但GraphQL提供了强类型的schema机制,从而确保了参数类型的合法性。
文档清晰。GraphQL会把schema定义和相关的注释生成可视化的文档,从而使代码的变更,直接反映到最新的文档上,避免像REST中手工维护可能会造成代码、文档不一致的问题。
扩展性好。
缺点:
GraphQL查询的复杂性。
查询频率限制。
GraphQL缓存。因为REST强制使用具有缓存机制的HTTP协议,你可以通过它避免获取多余资源。GraphQL没有缓存机制,它把缓存的重任交给了用户。
以上是关于一起走进GraphQL的主要内容,如果未能解决你的问题,请参考以下文章