首先我们来解释一下什么叫API,官方的解释口径是Application Programming Interface,即应用程序接口,它是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。
简单来说可以理解为是对预先定义的函数的一种封装方式,通过调用API可以实现特定的服务功能,而不需要了解其内部的实现细节。
映射到我们的日常开发过程中,系统间的调用交互通常就是以API的方式来访问服务及资源,当前较为主流的API类型有两种,分别为HTTP和RPC。
===========================================================
不同的API类型也有不同的格式风格,在HTTP类型的API领域下,我们常用的格式风格是RESTful,通过这种标准化的规范定义接口格式可以提高接口的自解释性和可扩展性,但由于服务的规模以及复杂度不断增长,也暴露了一些缺点,例如多个资源需要频繁交互,过度获取数据等等。
GraphQL的出现主要就是来解决RESTful当前的一些缺点,我们来看下官方的定义:
GraphQL既是一种用于PI的查询语言,通过在API中进行描述的方式,使得客户端能够准确地获得它所需要的数据,而且没有任何冗余,也让API更容易地随着时间推移而演进。
使用GraphQL的理由有如下几点:
1)向你的API发出一个GraphQL请求就能准确获得你想要的数据,因为控制数据的是应用,而不是服务器。
2)查询不仅能够获得资源的属性,还能沿着资源间引用进一步查询,通过一次请求就获取你应用所需的所有数据,提升响应性能。
3)基于类型和字段的方式进行组织,而非入口端点,你可以通过一个单一入口端点得到你所有的数据能力,同时使用类型来保证应用只请求可能的数据,还提供了清晰的辅助性错误信息。
schema定义结构
schema { #定义查询
query: UserQuery
}
type UserQuery { #定义查询的类型
user(id:ID) : User #指定对象以及参数类型
}
type User { #定义对象
id:ID! # !表示该属性是非空项
name:String
age:Int
GraphQL支持的字段类型有2种
1)对象类型:用户可以在schema中定义的自己的type
2)标量类型:String、 Int、 Float、 Boolean、ID等内置变量
GraphQL支持的操作类型主要有3种
1)query查询:查询数据,CRUD 中的 R
2)mutation修改:新增/修改/删除数据,CRUD 中的 CUD
3)substription订阅:当数据发生更改,则进行消息推送
===========================================================
总结:GraphQL采用了一种与REST完全不同的API方法,没有依赖HTTP结构,比如动词和URI,而是在数据之上提出了直观的查询语言和强大的type系统层,提供客户端和服务器之间的强约定,查询语言提供了一种让客户端开发者可以永久获取任何页面想要的任意数据的机制。
注:文章均原创,部分图片及文字来源于网络,若涉及版权,请联系作者,将第一时间备注出处,谢谢。