graphql--快速了解graphql特点

graphql--快速了解graphql特点

    • 1.它的作用
    • 2.demo示例
      • 2.1依赖引入
      • 2.2定义schema
      • 2.3定义GrapQL端点
      • 2.4运行测试
      • 2.5一些坑

今天浏览博客时看到graphQL,之前在招聘网站上第一次接触,以为是图数据查询语言,
简单了解后,发现对graphQL的介绍主要是用作API的查询语言,不仅限于图数据查询

如图:自定义返回的数据体字段(接口调用工具是graphql-starter自带的)

file
file

1.它的作用

graphQL是一种API查询语言,什么是API查询语言呢?并不是指用来查询API的,而是用来查询API提供的数据,一种为API而生的查询语言。
它通过提供一种灵活、精确的查询方式,解决了传统RESTful API的一些局限性,使得客户端能够更加高效地获取所需的数据。
那么现有风格的API有哪些问题呢?以下两点是我个人比较认可的:

  • 返回的数据结构是固定的。要么字段多了,要么字段少了。这种情况应该都经历过,字段多了,虽然调用者可以自行挑选需要的字段,但数据结构庞杂且占用带宽,字段少了
    则需要调整后端接口。
  • 接口数量太多。操作一个数据实体,CRUD没跑了。也正因为接口太多,才会有各种接口管理规范和工具的出现,比如swagger、apifox等。

那么上述问题,在graphQL中被解决:

  • 接口返回的数据字段由调用方自行决定。客户端可以根据schema自行决定查询哪些字段属性,不存在过多或不足。
  • 单一端点,对,没有错,一个系统只有一个接口。只要你想,你可以将员工、保险、立项这些风马牛不相及的对象都杂糅在一起 (当然,按照我们工程化、模块化的管理思路,以及高内聚的思想,还是按照领域进行划分,也便于维护管理)

上述这两条已经让人眼前一亮了,不是吗?至于有些资料提到的graphQL相较于RESTful API的优势,比如复杂数据需要多次查询,接口版本演进等,
我个人觉得这些并不是RESTful 的问题,而是在于接口设计的问题。接口设计如果有问题,再好的工具也会疲软。

2.demo示例

光说不太直观,通过demo感受一些graphQL的魅力(之前没注意到,spring官网居然也给出了GraphQL对应的入门demo)

2.1依赖引入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.2定义schema

既然是单一端点,那么除了查询,还可以定义保存和删除

# @author: yuanye.wang
# 定义操作:查询
type Query{# 通过ID查询getById(id: ID): Book# 通过name查询#bookByName(name: String!) :[Book]
}# 定义操作:保存、删除等(对应graphql中的变异 mutation)
type Mutation{createBook(name: String, pageCount: Int!, authorFirstName: String, authorLastName:String): Book#updateBook(id: ID, name: String!, pageCount: Int!): Book#deleteBook(id:ID): String
}# 自定义数据类型(内置类型以外的数据)
type Author {id: IDfirstName: StringlastName: String
}
type Book {id: IDname: StringpageCount: Intauthor: Author
}

2.3定义GrapQL端点

springboot提供了对应的starter,直接上注解。可以认为通过这些注解,将会在/graphql端点中暴露对应的方法(不再是直接将controller方法暴露为端点)

@RestController
public class BookController {@AutowiredBookService bookService;// @SchemaMapping(typeName = "Query", value = "getById")@QueryMapping(value = "getById")public Book getById2(@Argument String id) {return bookService.getById(id);}@MutationMapping(value = "createBook")public Book createBook(@Argument String name,@Argument int pageCount,@Argument String authorFirstName,@Argument String authorLastName) {return bookService.createBook(name,pageCount,authorFirstName,authorLastName);}
}

2.4运行测试

IDEA 、apifox中都可以执行,也可以开启graphql内置的浏览器工具: spring.graphql.graphiql.enabled=true ,以IDEA http举例。
我们在/graphql端点中暴露了两个方法:

  1. getById
  2. createBook
### 自定义查询
GRAPHQL http://localhost:8081/graphql
# 1.声明要调用的方法
query  getById($id: ID) {getById(id: $id) {# 2.自定义返回对象的字段idnamepageCountauthor {idfirstNamelastName}}
}
# 3.传入实参
{"id": "1"
}### 新增,和查询同一个端口
GRAPHQL http://localhost:8081/graphqlmutation  createBook($name: String, $pageCount: Int!, $authorFirstName: String, $authorLastName: String) {createBook(name: $name, pageCount: $pageCount, authorFirstName: $authorFirstName, authorLastName: $authorLastName) {idnamepageCountauthor {idfirstNamelastName}}
}{"name": "demo","pageCount": "666","authorFirstName": "fname","authorLastName": "lname"
}

2.5一些坑

  1. IDEA中GraphQL插件创建的文件是xxx.graphql,导致项目启动失败,需要改为 xxx.graphqls(spring官网demo有提到,没留意这个s,花了很长时间解决)
  2. 请求端口是/graphql, 浏览器UI工具是 /graphiql

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443136.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Meta 发布 Quest 3S 头显及 AR 眼镜原型:开启未来交互新视界

简介 在科技的浪潮中&#xff0c;Meta 始终站在创新的前沿&#xff0c;不断为我们带来令人惊叹的虚拟现实和增强现实体验。2024 年 10 月 6 日&#xff0c;让我们一同聚焦 Meta 最新发布的 Quest 3S 头显及 AR 眼镜原型&#xff08;Orion&#xff09;&#xff0c;探索这两款产品…

自由学习记录(2)

Unity打包图集相关 Draw Call 实验设置&#xff1a; 我们将创建两个场景&#xff0c;一个场景有高 Draw Call&#xff0c;另一个场景通过优化减少 Draw Call。然后对比它们的帧率&#xff08;FPS&#xff09;。 场景 1&#xff1a;高 Draw Call 场景&#xff08;无优化&…

【数据结构与算法-高阶】并查集

【数据结构与算法-高阶】并查集 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 并查集原理 2. 并查集实现 3. 并查集应用 1. 并查集原理 在一些应用问题中&…

了解HTTPS

目录 1.HTTP认识 2.HTTP请求 3.HTTP响应 4.URL 5.HTTP方法 面试题&#xff1a;POST 和 GET区别&#xff1f; 网上关于 GET 与 POST的差别 有待商议 关于请求报头 和 响应报头 6..Host &#xff1a; 7..USer-Agent&#xff08;简称UA&#xff09; 8.状态码 9.HTTPS 是…

读懂MySQL事务隔离

什么是事务 事务就是一组原子性的SQL查询&#xff0c;或者说一个独立的工作单元。事务内的语句&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败。 关于事务银行系统的应用是解释事务必要性的一个经典例子。 假设一个银行的数据库有两张表&#xff1a;支票表&#x…

【Windows】开始菜单关键错误以及系统应用闪退问题记录

一 开始菜单关键错误 Windows长时间没有重启&#xff0c;重启之后开始菜单点不进去&#xff0c;报错“关键错误”。 查询网上有两种解决方案&#xff1a; 【1】更新系统版本&#xff1b; 【2】通过powershell执行一次性恢复所有应用的指令&#xff1b; 我这边采用第二种方法&am…

如何使用pymysql和psycopg2执行SQL语句

在Python中&#xff0c;pymysql和psycopg2是两个非常流行的库&#xff0c;用于与MySQL和PostgreSQL数据库进行交互。本文将详细介绍如何使用这两个库来执行SQL查询、插入、更新和删除操作。 1. 准备工作 首先&#xff0c;确保已经安装了pymysql和psycopg2库。如果尚未安装&a…

指针函数C++

指针函数概念 指针函数在C中是一种特殊类型的函数。从本质上讲&#xff0c;它是一个函数&#xff0c;不过其返回值是一个指针类型的数据。例如&#xff0c;像int* plusfunction(int a, int b);这样的函数声明&#xff0c;plusfunction就是一个指针函数&#xff0c;它接受两个i…

CentOS7.9 下安装 Docker

第一步&#xff1a; sudo yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 第二步&#xff1a;安装 sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum -y install…

IT监控可视化:运维团队的智慧之眼

在当今这个数字化时代&#xff0c;IT系统已成为企业运营的核心支柱。随着业务的不断扩展和IT架构的日益复杂&#xff0c;运维团队面临着前所未有的挑战。如何高效、准确地监控和管理IT资源&#xff0c;确保系统的稳定性和可用性&#xff0c;成为了运维工作的重中之重。而IT监控…

CSS3--美若天仙!?

免责声明&#xff1a;本文仅做分享~ 目录 CSS引入方式 选择器 盒子尺寸和背景色 文字控制属性 单行文字 垂直居中 字体族 font复合属性 文本对齐方式 文本修饰线 color 文字颜色 ----- 复合选择器 伪类选择器 超链接伪类 CSS特性 继承性 层叠性 优先级 Emmet …

Linux驱动---光电开关、火焰传感器、人体红外传感器

文章目录 一、电路连接二、设备树三、驱动代码 一、电路连接 人体红外 – PF12 检测到人体时会产生一个上升沿 光电开关 – PE15 有遮挡物时会产生一个上升沿 火焰传感器 – PF5 有火焰时会产生一个上升沿 二、设备树 /{ //人体红外PF12human{ compatible "zyx,huma…

数据驱动投资:AI在股票市场的应用

当ChatGPT首次亮相时&#xff0c;其卓越的语言处理能力立刻引起了许多行业的广泛关注&#xff0c;投资界也不例外。关于ChatGPT是否能应用于投资决策的问题&#xff0c;迅速成为热门讨论的焦点。 近期&#xff0c;加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…

[论文阅读] DVQA: Understanding Data Visualizations via Question Answering

原文链接&#xff1a;http://arxiv.org/abs/1801.08163 启发&#xff1a;没太读懂这篇论文&#xff0c;暂时能理解的就是本文提出了一个专门针对条形图问答的数据集DVQA以及一个端到端模型SANDY&#xff0c;模型有两个版本&#xff0c;Oracle和OCR。主要解决的问题是固定词表无…

C++ —— 优先级队列(priority queue)的模拟实现

目录 杂谈 vector和list的区别 1. 优先级队列的定义 2. 优先级队列的模拟实现 3. 仿函数 链接&#xff1a; priority_queue - C Reference (cplusplus.com)https://legacy.cplusplus.com/reference/queue/priority_queue/?kwpriority_queue 杂谈 vector和list的区别 在…

UPDATE 和 DELETE数据库表的多行

文章目录 说明程序测试结果 说明 程序 *&---------------------------------------------------------------------* *& Report Z_TEST_1008 *&---------------------------------------------------------------------* *& *&--------------------------…

手机怎样改网络ip地址?内容详尽实用

随着网络技术的发展&#xff0c;更改手机IP地址已成为一种常见需求。本文将详细介绍如何在不同网络环境下更改手机IP地址&#xff0c;包括移动网络和WiFi网络&#xff0c;以及同时适用于两种网络的方法&#xff0c;内容详尽实用&#xff0c;干货满满。 一、适用于移动网络&…

vue3 vue2

vue3.0是如何变快的&#xff1f; diff算法优化 vue2的虚拟dom是进行全局的对比。vue3 新增了静态标记&#xff08;patchFlag&#xff09; 在与上次虚拟节点进行比较的时候&#xff0c;只对比带有patch Flag的节点&#xff0c;并且可以通过flag的信息得知当前节点要对比的具体内…

10.9 Qt事件处理机制

键盘按键调整label移动 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QKeyEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);}Widget::~Widget() {delete ui;…

C++——vector

目录 一、简介 二、接口 1.构造 2.空间变化 3.增删查改 三、vector与string的区别 四、模拟实现 vector.h test.cpp 一、简介 vector&#xff0c;其实就是我们C语言学过的动态顺序表&#xff0c;一个可以存储任何数据类型&#xff0c;可以动态增长的数组。C的STL将其收…