graphQL(一)——入门

mac2024-05-08  51

Why graphQL

我们在使用Rest接口时,接口返回的数据格式、数据类型都是后端预先定义好的,如果返回的数据格式并不是调用者所期望的(比如:只需要用其中的某些字段),作为前端的人员可以通过以下两种方式来解决问题:

与后端沟通,修改接口(更改数据源)自己做一些适配工作(处理数据源)

一般如果是个人项目,改后端接口这种事情可以随意,但是如果是公司项目,改后端接口往往是一件比较敏感的事情。因此如果接口的返回值,可以通过某种手段,从静态变为动态,即调用者来声明接口返回什么数据,很大程度上可以进一步解耦前后端的关联。那么graphql是否可以完成此需求呢,我们一起来学习看看吧。

What graphQL

关于graphQL的介绍在网上有很多,但从核心上讲,是一门语言;进一步讲,是一门查询语言;再进一步讲,是一种API查询语言,为我们提供了一种更有效的设计、创建和使用 Api的方法有疑问?API还能查?API不是用来调用的吗?没错,这正是GraphQL的强大之处。

Feature

需要什么就获取什么数据支持关系数据的查询API无需定义各种路由,完全数据驱动减少网络请求不需要解决跨域问题强大的配套开发工具类型检查

How GraphQL

在GraphQL中,通过预先定义Schema和声明一些Type来达到上面的效果,我们需要知道:

对于数据模型的抽象是通过Type来描述的对于接口获取数据的逻辑是通过Schema来描述的

Start

Type

Scalar Type(标量类型)

标量类型:String、Int、Float、Boolean、Enum

Object Type(对象类型)

type Product { id: ID name: String isUnShelve: Boolean }

Schema

是用来描述对于接口获取数据逻辑的。在graphQL中,我们用Query来描述资源的获取方式。Query?

Query GraphQL中使用Query来抽象数据的查询逻辑,有三种查询类型:

query(查询)mutation(更改)subscription(订阅)

GraphQL中Schema,Type,Query之间的关系是怎样的呢?

Query 代表的是查询的统称,也就是一次查询可以成为一个 Query;query 是 Query 的一个类型种类,当前有三种类型: query,mutation,subscription;关系:Schema 由 Type 来描述,Query 的查询语法和格式受 Schema 约束,而 query,mutation,subscription 是 Query 的三种类型,分别对应不同的业务场景。

举例说明

查询

//Rest接口 GET /api/getData/product/ //graphql query{ getProduct():[Product] }

更改

//Rest接口 POST /api/getData/product/ //graphql mutation { createProduct(): Product }

在graphql中就这样可以查询和增加数据了?当然不是喽(才进行一半喲),咱们继续吧👇👇👇

Resolver

❉ Resolver在graphql中扮演什么样的角色呢?我们来举个🌰吧:

去餐厅时首先会看菜单 (这个菜单就如同GraphQL的Schema),一一列出关于「我们可以点的食物(查询的资料)」、「套餐搭配(资料间的关联)」、「套餐的内容(资料的架构)」等。点完餐,后面的厨房就开使针对我们的餐点料理出你要的食物(拿出你要的资料) ,也就是Resolvers在做的事情。

❉ 问题:如果Schema是菜单、 Resolver是厨房,那点餐的人是?

❉ Resolver(厨房)具体是如何工作的呢(graphql内部工作机制)?

🌰

//查询 Query { getClassify { id product { id, name } } } //type type classify{ id ...... } type Product{ id name ...... }

步骤

首先进行第一层解析,需要它的名字是getClassify;之后会尝试使用getClassify的Resolver获取解析数据,第一层解析完毕;之后对第一层解析的返回值,进行第二层解析,当前getClassify还包含2个子Query,分别是id和product: id为标量类型,解析结束;product为对象类型,尝试使用Product的Resolver获取数据,当前field解析完毕;之后对第二层解析的返回值,进行第三层解析,当前product还包含一个Query, id,name,由于它是标量类型,解析结束 。
最新回复(0)