一块儿走进GraphQL

本文原创:yinyue前端

什么是GraphQL?

GraphQL 是一种面向数据的 API 查询语言(规范),是一种协议而非存储。GraphQL对你的API中的数据提供了一套易于理解的完整描述,使得客户端可以准确地得到它须要的数据,并且没有任何冗余。java

GraphQL由Facebook发起,其手机客户端自2012年起,就全面采用了GraphQL查询语言, 2015年, Facebook全面开源了第一份GraphQL规范。到目前为止,在Twitter,Github,Pinterest,Shopify等大型网站也获得了普遍的实践。语言也从最初的js,扩展到java ,python,Go。python

强类型语言

其实GraphQL所须要学习的语法不多,大部分语法与咱们平时的语法一致,能够经过官网详细了解 graphql.cn。 能够本身实现增删改查等操做。 须要特别注意的是,GraphQL是一门强类型语言,咱们须要定义每个属性的类型。以下图所示:api

2.jpeg

下面是一个简单的类型定义,先是定义了一个枚举,而后咱们定义了一个类型,类型中有四个属性: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/getUserByIdmarkdown

新增一我的员的接口url定义为: /api/v1/user/createUser网络

这样前端人员调用起来会很直观。app

可是graphql是彻底不同的使用方式,其向前端暴露的url就一个像/api/graphql之类的,那这么多接口怎么区分呢? 咱们来看看:

3.jpeg

奥妙就是上面这张图,一个graphql接口都有一个Schema定义。

其定义三种操做方式:query(查询),mutation(变动)和subscription(监听)。

再往下延伸,一个查询中包含多个field,也就是多种不一样的查询,好比query user查询人,query message查询消息,query weather查询天气。

经过这些就实现了Restful API使用多个url来达到不一样操做的效果。

GraphQL和传统REST相比有什么不一样?

1.png

相同点:

  • 二者都有资源的概念,并能够为这些资源指定ID。
  • 二者均可以经过HTTP GET请求获取URL。
  • 二者均可以在请求中返回JSON数据。

不一样点:

  • 在REST中,您调用的端点是该对象的标识。 在GraphQL中,标识与获取它的方式是分开的。
  • 在REST中,资源的类型和大小由服务器决定。 在GraphQL中,服务器声明哪些资源可用,客户端询问它须要什么

GraphQL的优势和缺点

优势:

  • 能够经过请求控制返回的数据。
  • 减小网络请求次数。能够经过一个资源入口访问到关联的其余资源,只要事先在schema中定义好资源之间的关系便可,传输不同的数据,而REST则提供多个URL端点来获取相关的资源。
  • 参数类型强检验。REST方案自己没有对参数的类型作规定,每每都须要自行实现参数的校验机制,以确保安全。但GraphQL提供了强类型的schema机制,从而确保了参数类型的合法性。
  • 文档清晰。GraphQL会把schema定义和相关的注释生成可视化的文档,从而使代码的变动,直接反映到最新的文档上,避免像REST中手工维护可能会形成代码、文档不一致的问题。
  • 扩展性好。

缺点:

  • GraphQL查询的复杂性。
  • 查询频率限制。
  • GraphQL缓存。由于REST强制使用具备缓存机制的HTTP协议,你能够经过它避免获取多余资源。GraphQL没有缓存机制,它把缓存的重任交给了用户。
相关文章
相关标签/搜索