您可能已经看过很多关于GraphQL的内容,在这个过程中是不是有时会感到
06月28日 09:11
您可能已经看过很多关于GraphQL的内容,在这个过程中是不是有时会感到困惑和不知所措。本文让我尝试用更简单易懂的语言回答关于GraphQL的三个主要问题:GraphQL是什么,如何工作,何时使用?希望对您更好地理解GraphQL有所裨益。
1 什么是GraphQL“Graph”指的是数据以类似图形的结构表示和连接。在GraphQL中,数据表示为具有节点和边的图形,允许不同数据实体之间的灵活关系。
“QL”代表“查询语言”,因为GraphQL提供了一种精确和可控的查询或请求数据的语言。
(资料图片仅供参考)
示例:书和作者的关系可以用图来表示,可以很容易地使用GraphQL进行查询:
深入研究GraphQL,我们发现它是:
类型系统:定义数据的外观以及事物之间的关系。类型系统定义各种数据类型和架构,这是客户端和服务器之间的合同。查询语言:查询数据的语言,它知道从哪里获取数据并包含验证或执行查询的规则。简而言之,GraphQL能让客户端精确指定它需要从API获取的数据。
Facebook在2012年开始开发GraphQL,并于2015年将其发布为开源。2018年,GraphQL被移至新成立的GraphQL基金会,由非营利组织Linux基金会托管。
GraphQL支持读取、写入(变异)和订阅数据的更改,让我们可以实时更新。
2 GraphQL如何工作GraphQL有两个部分:请求数据的客户端和提供数据的服务器,以下是解释其工作原理的步骤:
i)定义模式:服务器定义GraphQL模式,这类似于描述可用数据和操作的蓝图。例如,如果我们有一个带有字段(id、name和pageCount)的Book实体,并且有一个查询是按id查询书籍,则其模式将如下所示:
type Query { bookById(id: ID): Book}type Book { id: ID name: String pageCount: Int}
ii)发送查询:客户端向服务器发送GraphQL查询,指定所需数据和所需结构。
query bookDetails { bookById(id: "book-1") { id name pageCount }}
iii)解决查询:服务器的GraphQL引擎接收查询并开始解决查询。它根据查询确定需要哪些数据,以及应执行哪些解析器函数来获取该数据。
iv)获取数据:解析器函数根据查询要求从各种数据源(例如数据库、API)检索数据。
v)组装响应:GraphQL引擎收集检索到的数据,并按客户端请求的格式组装响应。它仅包括查询中请求的确切数据字段,减少不必要的数据传输。
vi)返回响应:服务器将响应发送回客户端,提供查询中精确请求的数据。
3 何时可以使用GraphQLGraphQL适用于处理复杂或经常变化的数据需求,因为它可以将数据请求的控制权交给客户端,让客户端在任何时间请求任何数据。这让在每次API变更迭代或从这些API请求的数据发生变化时更容易进行更新。与REST API相比,GraphQL允许客户端精确指定所需数据的结构和字段,从而避免了获取过度或获取不足的问题。因此,GraphQL可以提高数据传输的精确性和效率,使应用程序更加灵活和可扩展。
如果应用程序需要从多个来源聚合数据,GraphQL可以帮助把这些来源统一到单个API中。它提供了一个抽象层,可从各种服务中获取和组合数据,使数据的获取和整合更加简单和高效。
当应用程序需要实时更新和订阅时,GraphQL提供内置功能。这些功能允许客户端订阅特定数据的变化,并在数据更改时实时推送通知,从而提高应用程序的实时性和响应性。
总之,如果您需要更好地控制和定制API响应,并希望有效地处理复杂或不断变化的数据需求,那么GraphQL是一个非常有用的工具。
4 使用Spring实现GraphQL随着spring-boot-starter-graphql框架的到来,使用Spring实现GraphQL变得更加容易。
在Spring项目中集成GraphQL的步骤如下:
i)向项目添加gradle/maven graphql starter依赖:
//Gradleimplementation "org.springframework.boot:spring-boot-starter-graphql"//Maven org.springframework.boot spring-boot-starter-graphql
ii)创建一个目录src/main/resources/graphql,并在该目录下添加一个名为schema.graphqls的文件,包含以下内容:
type Query { bookById(id: ID): Book}type Book { id: ID name: String pageCount: Int}
在这里,我们创建了一个Book的schema。每个schema都有一个顶级查询类型,这里的schema定义了一个名为bookById的查询,用于返回特定书籍的详细信息。
iii)GraphQL服务器中的每个复杂类型都由Java bean表示,并且Java bean中的字段将直接映射到GraphQL响应中的字段,其名称基于字段名称。
public record Book (String id, String name, int pageCount) { private static List books = Arrays.asList( new Book("book-1", "Effective Java", 416), new Book("book-2", "Hitchhiker"s Guide to the Galaxy", 208), new Book("book-3", "Down Under", 436) ); public static Book getById(String id) { return books.stream() .filter(book -> book.id().equals(id)) .findFirst() .orElse(null); }}
iv) Spring的GraphQL提供了基于注解的编程模型。通过控制器注释方法,我们可以声明如何获取特定GraphQL字段的数据。现在让我们添加BookController.java
@Controllerpublic class BookController { @QueryMapping public Book bookById(@Argument String id) { return Book.getById(id); }}
通过定义一个名为bookById的方法并用@QuerMapping注释,此控制器声明了如何获取Query类型下定义的Book。查询字段从方法名称确定,但也可以在注释本身上声明。
v) Spring的GraphQL还为我们提供了一个用于编写和执行查询的可视界面,名为GraphiQL。通过将以下配置添加到application.yaml文件中启用GraphiQL:
spring graphql graphiql enabled: true
启动Spring应用程序并导航到http://localhost:8080/graphiql.
vi)在窗口顶部键入查询并单击播放按钮。
query bookDetails { bookById(id: "book-1") { id name pageCount }}
您将看到以下响应:
这样您已经构建了一个GraphQL服务并成功查询了数据!您的数据之旅从此开始!快动手试试吧~
关键词:
您可能已经看过很多关于GraphQL的内容,在这个过程中是不是有时会感到
06月28日 09:11
云南信息报讯云上融媒记者徐蓉6月26日,按照省、市、区党委、政府关于
06月28日 08:57
1、刚性基础就是受刚性角限制的基础,如毛石基础,混凝土基础,砖基础
06月28日 09:09
1、此生第一支笛貌似也就十几块,当时互联网不发达,可能放到网上会更
06月28日 09:18
痛则思变,财富管理市场的真正博弈正呼啸而至。最近多家基金公司大幅下
06月28日 09:13
乾元泽孚股东彭泓越质押700万股用于向银行贷款提供质押担保2023 6 2720
06月28日 09:23
近日,三达膜(688101 SH)在官微发布总经理女儿高考取得高分的“喜报
06月28日 09:18
1、首先你要确认你同事授权同意你发布信息这个毕竟是家事确认之后最好
06月28日 09:01
在2023MWC上海期间5G发展创新论坛上,华为无线网络产品线总裁曹明发表
06月28日 09:04
南充将打造全国最大规模的江畔露营基地。
06月28日 09:20
智通财经APP获悉,LucidGroup(LCID US)周二在提交给美国证券交易委员会
06月28日 09:02
近日,珠海市知识产权协同保护工作推进会顺利召开,珠海市知识产权局、
06月28日 09:11
在20万级的家用市场,能站稳脚跟的中国品牌产品并不多,传祺GS8算是
06月28日 09:03
法治日报全媒体记者蒲晓磊6月26日,十四届全国人大常委会第三次会议对
06月28日 09:00
6月17日,河南大学国内合作办公室主任、河南戏剧学院党委书记张润泳到通许县竖岗镇调研指导基层党建、乡村振兴等工作,竖岗镇党委副书记、
06月28日 09:27
???自“书记工程”实施以来,共青农场有限公司以习近平新时代中国特
06月28日 09:14
6月9日,河南大学机关党委副书记史周宾到通许县竖岗镇调研基层党建工作。竖岗镇党委副书记、镇长王卫东,竖岗镇党委委员、人大主席侯月梅陪
06月28日 09:27
6月2日,河南大学国内合作办公室副主任刘会宾带领调研组到通许县竖
06月28日 09:14
6月2日下午,河南省交通事业发展中心工程建设处副处长徐继连到通许县竖岗镇调研指导三夏生产工作。在竖岗镇,徐继连一行详细了解当前麦收进
06月28日 09:26
6月27日上午11时,备受广大市民关心的西安地铁16号线一期、地铁2号线二
06月28日 08:59
“群山万壑赴荆门,生长明妃尚有村。”周镇在接受采访伊始,朗诵了杜甫
06月28日 09:01
银行工作人员透露:聪明人从不选择大额存款,有这3个致命弊端,储户,理
06月28日 09:10
北京时间6月27日,著名网站德转调整了法甲球员的身价,姆巴佩依然以1 8
06月28日 09:01
格隆汇6月27日丨菲利华300395300395SZ公布截至公告日实际控制人邓家贵
06月28日 09:09
购入中国恒大中心业主权属?云锋金融:消息不实
06月28日 08:53
房企股权融资政策出台后,深交所加快再融资项目审核进度,支持符合条件
06月28日 09:06
《科创板日报》6月27日讯(特约记者郑炳巽)26日,信达生物(1801 HK)
06月28日 09:10
聊聊一篇色金属材料速查手册,对于有色金属材料速查手册简单介绍的文章
06月28日 09:15
富国银行看好以下两只美股。
06月28日 08:58
聊聊一篇色金属熔炼与铸锭,对于有色金属熔炼与铸锭简单介绍的文章,网
06月28日 08:58