graphql--快速了解graphql特点

news2024/11/26 14:48:18

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: ID
    firstName: String
    lastName: String
}
type Book {
    id: ID
    name: String
    pageCount: Int
    author: Author
}

2.3定义GrapQL端点

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

@RestController
public class BookController {
    @Autowired
    BookService 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.自定义返回对象的字段
      id
      name
      pageCount
      author {
          id
          firstName
          lastName
      }
  }
}
# 3.传入实参
{
   "id": "1"
}

### 新增,和查询同一个端口
GRAPHQL http://localhost:8081/graphql

mutation  createBook($name: String, $pageCount: Int!, $authorFirstName: String, $authorLastName: String) {
  createBook(name: $name, pageCount: $pageCount, authorFirstName: $authorFirstName, authorLastName: $authorLastName) {
      id
      name
      pageCount
      author {
          id
          firstName
          lastName
      }
  }
}

{
   "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.coloradmin.cn/o/2193028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dbeaver的使用

新增mysql连接 新增clickhouse 连接 新建编辑器 执行 结果&#xff0c;想看某条结果明细&#xff0c;选中某行安tab键 设置快捷键 窗口-》首选项-》用户界面-》键

ReentrantLock 实现原理

文章目录 ReentrantLock 基本使用可重入锁等待可中断设置超时时间公平锁条件变量 ReentrantLock 原理加锁流程解锁流程可重入锁原理可打断原理公平锁原理条件变量原理 ReentrantLock 基本使用 在Java中&#xff0c;synchronized 和 ReentrantLock 都是用于确保线程同步的锁&am…

JUPITER Benchmark Suite:是一套全面的23个基准测试程序,目的支持JUPITER——欧洲首台E级超级计算机的采购

2024-08-30&#xff0c;由于利希超级计算中心 创建JUPITER Benchmark Suite&#xff0c;这是一个全面的 23 个基准测试程序集合&#xff0c;经过精心记录和设计&#xff0c;目的支持购买欧洲第一台百万兆次级超级计算机 JUPITER。 一、研究背景&#xff1a; 随着E级超级计算机…

AI大模型有哪些,收藏起来防踩坑

大模型是指具有数千万甚至数亿参数的深度学习模型&#xff0c;通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能&#xff0c;能够处理更加复杂的任务和数据。以下是对大模型的详细数据与分析&#xff1…

在网页中渲染LaTex公式

概述 MathJax可以实现网页浏览器中的LaTex公式渲染。 引入 可以使用特定的模板形式引入和配置&#xff0c;具体可参考&#xff1a;配置mathjax — MathJax 3.2 文档 (osgeo.cn)。其中代码可以以CDN形式引入&#xff1a;mathjax (v3.2.2) -BootCDN。 <script> MathJax …

【C++驾轻就熟】vector深入了解及模拟实现

​ 目录 ​编辑​ 一、vector介绍 二、标准库中的vector 2.1vector常见的构造函数 2.1.1无参构造函数 2.1.2 有参构造函数&#xff08;构造并初始化n个val&#xff09; 2.1.3有参构造函数&#xff08;使用迭代器进行初始化构造&#xff09; 2.2 vector iterator 的使…

集全CNS!西北农林发表建校以来第一篇Nature

9月25日&#xff0c;国际学术期刊《自然》&#xff08;Nature&#xff09;在线发表了西北农林科技大学青年科学家岳超研究员领衔的团队题为《极端森林大火放大火后地表升温》的研究成果。该研究首次从林火规模这一独特视角&#xff0c;揭示了极端大火对生态系统破坏性、林火碳排…

受电端取电快充协议芯片的工作原理

随着电池技术的不断进步&#xff0c;快充技术应运而生&#xff0c;它以惊人的速度解决了“电量焦虑”成为手机技术发展的重要程碑。 快充技术&#xff0c;通过提高充电功率&#xff0c;大幅度缩短手机等设备充电时间的技术。相对于传统的慢充方式&#xff0c;快充技术能够在短…

ASP.NET MVC 下拉框的传值-foreach循环

数据表&#xff1a; -- 创建包裹分类表 CREATE TABLE PackageCategories (CategoryID INT PRIMARY KEY IDENTITY(1,1), -- 分类ID&#xff1a;整数类型&#xff0c;主键&#xff0c;自增&#xff0c;包裹分类的唯一标识CategoryName NVARCHAR(255) NOT NULL -- 包裹分类名称&a…

从零开始讲PCIe(11)——数据链路层介绍

一、概述 数据链路层这一层的逻辑是用来负责链路管理的&#xff0c;它主要表现为 3 个功能TLP 错误纠正、流量控制以及一些链路电源管理。它是通过如图 2-24 所示的DLLP&#xff08;Data Link Layer Packet&#xff09;来完成这些功能的。 二、DLLPs 数据链路层包&#xff08;D…

基于Springboot+Vue的在线问诊系统的设计与实现(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

PDFToMarkdown

pdf转markdown 安装Tesseract-OCR项目拉取pytorch安装开始转换转换单个文件转换多个文件总结github开源PDF转markdown git clone https://github.com/VikParuchuri/marker.git 注意该项目有些包的语法需要python3.10,所以需要安装python3.10. 导入pycharm,下面选择取消 安…

Git分支-团队协作以及GitHub操作

Git分支操作 在版本控制过程中&#xff0c;同时推进多个任务> 程序员开发与开发主线并行&#xff0c;互不影响 分支底层也是指针的引用 hot-fix:相当于若在进行分支合并后程序出现了bug和卡顿等现象&#xff0c;通过热补丁来进行程序的更新&#xff0c;确保程序正常运行 常…

【Conda】Conda命令详解:高效更新与环境管理指南

目录 1. Conda 更新命令1.1 更新 Conda 核心1.2 更新所有包 2. 严格频道优先级3. 强制安装特定版本4. 创建与管理环境4.1 创建新环境4.2 激活和停用环境4.3 导出和导入环境4.4 删除环境 5. 清理缓存总结 Conda 是一个强大的包管理和环境管理工具&#xff0c;广泛应用于数据科学…

Linux中环境变量

基本概念 环境变量Environmental variables一般是指在操作系统中用来指定操作系统运行环境一些参数。 我们在编写C、C代码时候&#xff0c;在链接的时候从来不知道我们所链接的动态、静态库在哪里。但是还是照样可以链接成功。生成可执行程序。原因就是相关环境变量帮助编译器…

C#医学影像分析源码,医院影像中心PACS系统源码

医学影像系统源码&#xff0c;影像诊断系统PACS源码&#xff0c;C#语言&#xff0c;C/S架构的PACS系统全套源代码。 PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以…

【数据结构】【链表代码】相交链表

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {//先求出两个链表的长度ListNode…

初始爬虫12(反爬与反反爬)

学到这里&#xff0c;已经可以开始实战项目了&#xff0c;多去爬虫&#xff0c;了解熟悉反爬&#xff0c;然后自己总结出一套方法怎么做。 1.服务器反爬的原因 服务器反爬的原因 总结&#xff1a; 1.爬虫占总PV较高&#xff0c;浪费资源 2.资源被批量抓走&#xff0c;丧失竞争力…

【Blender Python】2.结合Kimi生成

概述 结合Kimi这样的AI工具可以生成Blender Python代码&#xff0c;用来辅助生成一些或简单或复杂的图形。当然&#xff0c;出不出错这就不一定了。因为AI所训练的版本可能并不是Blender的最新版本&#xff0c;类似的问题也出现在Godot上。 测试 在kimi中提问&#xff0c;获…

全栈开发从未如此轻松:Bolt.new 让 AI 助力编程体验

你是否曾经因为复杂的开发环境配置而感到烦恼&#xff1f;现在&#xff0c;开发者们有了一个新的选择&#xff1a;StackBlitz 推出的创新平台 Bolt.new&#xff0c;彻底改变了全栈开发的传统方式。这个平台结合了人工智能和WebContainers技术&#xff0c;让你仅仅通过一个浏览器…