Spring Boot 2.7.11 集成 GraphQL

GraphQL介绍

GraphQL(Graph Query Language)是一种用于API的查询语言和运行时环境,由Facebook于2012年创建并在2015年公开发布。与传统的RESTful API相比,GraphQL提供了更灵活、高效和强大的数据查询和操作方式。

以下是GraphQL的一些主要特点和概念:

  1. 灵活性: 客户端可以精确指定需要的数据,而不会获得多余或不需要的信息。这允许前端应用程序更有效地获取所需的数据,减少了不必要的数据传输和处理。
  2. 单一端点: 与RESTful API不同,GraphQL通常只有一个端点,客户端可以在一个请求中指定所需的所有数据。这消除了多个端点的复杂性,提高了请求效率。
  3. 强类型系统: GraphQL具有明确定义的数据类型,客户端和服务器之间的通信是基于这些类型的。这使得开发更容易,并减少了潜在的通信错误。
  4. 关联和嵌套查询: 可以在一个请求中同时获取关联的数据,而不需要多个请求。这样可以减少网络延迟,并提高性能。
  5. 实时数据: GraphQL支持实时数据传输,使得客户端能够订阅数据的变化,从而实时更新界面。
  6. 文档性: GraphQL有强大的自描述能力,通过introspection可以获取API的详细信息。这样可以轻松创建自动化工具,例如自动生成文档或客户端代码。
  7. 版本控制: GraphQL允许在API中逐步添加新字段和类型,而不会破坏现有客户端的功能。这降低了版本迁移的难度。

GraphQL的基本概念包括:

  • 查询(Query): 定义客户端请求的数据结构,以及所需的字段和关联关系。
  • 变更(Mutation): 用于对数据进行写操作的请求,例如创建、更新或删除数据。
  • 订阅(Subscription): 允许客户端接收实时数据的推送,使得应用程序能够立即响应数据的变化。
  • 类型系统: 定义API中所有可能的数据类型,包括标量(Scalar)、对象(Object)、枚举(Enum)等。
pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-boot-test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><spring-boot.version>2.7.11</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-graphql</artifactId><version>${spring-boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>${spring-boot.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><pluginRepositories><pluginRepository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><snapshots><enabled>true</enabled></snapshots></pluginRepository><pluginRepository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories></project>

实体类

两个实体类:Book 和 Author

package com.testcode.model;import java.util.Arrays;
import java.util.List;public class Author {private String id;private String firstName;private String lastName;public Author(String id, String firstName, String lastName) {this.id = id;this.firstName = firstName;this.lastName = lastName;}private static List<Author> authors = Arrays.asList(new Author("author-1", "Joanne", "Rowling"),new Author("author-2", "Herman", "Melville"),new Author("author-3", "Anne", "Rice"));public static Author getById(String id) {return authors.stream().filter(author -> author.getId().equals(id)).findFirst().orElse(null);}public String getId() {return id;}}

package com.testcode.model;import java.util.Arrays;
import java.util.List;public class Book {private String id;private String name;private int pageCount;private String authorId;public Book(String id, String name, int pageCount, String authorId) {this.id = id;this.name = name;this.pageCount = pageCount;this.authorId = authorId;}private static List<Book> books = Arrays.asList(new Book("book-1", "Harry Potter and the Philosopher's Stone", 223, "author-1"),new Book("book-2", "Moby Dick", 635, "author-2"),new Book("book-3", "Interview with the vampire", 371, "author-3"));public static Book getById(String id) {return books.stream().filter(book -> book.getId().equals(id)).findFirst().orElse(null);}public String getId() {return id;}public String getAuthorId() {return authorId;}}
Controller
package com.testcode.controller;import com.testcode.model.Author;
import com.testcode.model.Book;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;@Controller
public class BookController {@QueryMappingpublic Book bookById(@Argument String id) {return Book.getById(id);}@SchemaMappingpublic Author author(Book book) {return Author.getById(book.getAuthorId());}}

application.yml配置
server:port: 9999spring:graphql:graphiql:path: /graphiqlenabled: true

启动类
package com.testcode;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import java.util.Arrays;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

浏览器访问调试窗口

http://localhost:9999/graphiql?path=/graphql

输入查询语句:

query bookDetails {bookById(id: "book-3") {idnamepageCountauthor {key:id -- 别名映射firstNamelastName}}
}

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

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

相关文章

Spring技术内幕笔记之SpringMvc

WebApplicationContext接口的类继承关系 org.springframework.web.context.ContextLoader#initWebApplicationContext 对IOC容器的初始化 SpringMvc如何设计 DispatcherServlet类继承关系 MVC处理流程图如下&#xff1a; DispatcherServlet的工作大致可以分为两个部分&#xf…

NFC物联网开发智能衣橱解决方案

智能衣橱是智能家居的重要内容&#xff0c;现代家居市场对家居智能化控制尤为重视。但是&#xff0c;传统家居生产功能和模式已经无法满足智能化时代的需求&#xff0c;所以家居智能化成为家居行业发展的主要需求。与传统衣橱对比&#xff0c;智能衣橱的功能强大方便人们的生活…

Android--Jetpack--WorkManager详解

2024已经到来&#xff0c;愿你安睡时&#xff0c;山河入梦。愿你醒来时&#xff0c;满目春风。愿你欢笑时&#xff0c;始终如一。愿你行进时&#xff0c;前程似锦&#xff0c;坦荡从容。 编程语言的未来&#xff1f; 目录 一&#xff0c;定义 二&#xff0c;特点 三&#xff0c…

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。这个问题如何解决?

这个错误信息 vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 表示 vue-cli-service 命令在你的系统上未被识别。这通常是因为 Vue CLI 没有被正确安装或其路径没有被加入到系统的环境变量中。以下是几个解决这个问题的步骤&#xff1a; 确认 …

LinkedList与ArrayList的比较

1.LinkedList 基于双向链表&#xff0c;无需连续内存 随机访问慢&#xff08;要沿着链表遍历&#xff09; 头尾插入删除性能高 占用内存多 2.ArrayList 基于数组&#xff0c;需要连续内存 随机访问快&#xff08;指根据下标访问&#xff09; 尾部插入、删除性能可以&…

从0搭建github.io网页

点击跳转到&#x1f517;我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行&#xff0c;始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

Linux 命令echo

命令作用 输出一行字符串在shell中&#xff0c;可以打印变量的值输出结果写入到文件在显示器上显示一段文字&#xff0c;起到提示的作用 语法 echo [选项] [字符串] 参数 字符含义-n不自动换行-e解释转义字符-E不解释转义字符 如果-e有效&#xff0c;则识别以下序列&…

SpringBoot 项目如何生成 swagger 文档

推荐使用 springdoc-openapi 的理由 1、springdoc-openapi 是 spring 官方出品&#xff0c;与 springboot 兼容更好&#xff08;springfox 兼容有坑&#xff09; 2、springdoc-openapi 社区更活跃&#xff0c;springfox 已经 2 年没更新了 3、springdoc-openapi 的注解更接近 …

(一)Matlab数值计算基础

目录 1.1Matlab命令组成 1.1.1基本符号 1.1.2功能符号 1.1.3常用命令 1.1Matlab命令组成 1.1.1基本符号 #提示运算符&#xff0c;表示软件处于准备就绪状态。在提示符号后输入一条命令或者一段程序后按Enter键&#xff0c;软件将给出相应的结果 >> *…

【Proteus仿真】【Arduino单片机】汽车尾气检测报警系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、蜂鸣器模块、CO、NOx、HC和PM2.5气体传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示CO、NOx、HC和…

手机录屏没有声音?让你的录屏有声有色

“有人知道手机录屏怎么录声音吗&#xff1f;今天录制了一个小时的直播视频&#xff0c;后面查看的时候发现没有声音&#xff0c;真的非常崩溃&#xff0c;想问问大家有没有办法&#xff0c;解决这个问题。” 在手机录屏的过程中&#xff0c;有时候我们可能会面临录制视频没有…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转&#xff1a; 依赖对象的获得被反转了&#xff0c;于是依赖反转更名为&#xff1a;依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的&#xff0c;这使得每个对象都需要与其合作的对象的引用&#xff0c;如果这个获取过程需要自身…

从0开始搭建清华ChatGLM3 6b大模型(Windows RTX4090版)

目录 1、硬件及软件说明 2、安装Anaconda 3、安装Git版本控制 ​4、安装pytorch驱动 5、安装ChatGLM3 1、硬件及软件说明 硬件&#xff1a;主要是GPU卡内存要足够&#xff0c;本次搭建使用的RTX4090卡一张&#xff0c;单卡内存24G&#xff0c;为什么选择4090&#xff1f;…

如何在ArcGIS Pro中指定坐标系

在进行制图的时候&#xff0c;为了实现某些特定的效果&#xff0c;需要指定特定的坐标系&#xff0c;但是现有的数据可能不是所需要的坐标系&#xff0c;这时候就需要对现有的数据坐标系进行处理&#xff0c;这里为大家介绍一下ArcGIS Pro中指定坐标系的方法&#xff0c;希望能…

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0c;其…

蓝牙物联网漏洞攻击的几种方式?

在物联网日益普及的今天&#xff0c;蓝牙技术的广泛应用为我们的生活带来了诸多便利。然而&#xff0c;正如一枚硬币有两面&#xff0c;蓝牙技术的普及也带来了新的安全挑战。近日&#xff0c;一项关于蓝牙物联网漏洞攻击的研究引起了广泛关注。这项研究揭示了蓝牙物联网所面临…

机器视觉在食品安全检测领域的应用与展望

​随着人们生活水平的提高&#xff0c;对食品安全的要求也越来越高。在这种背景下&#xff0c;机器视觉技术作为一种高效、准确的自动化检测手段&#xff0c;在食品安全检测领域扮演着越来越重要的角色。机器视觉系统通过模拟人眼的视觉功能&#xff0c;借助相机和计算机视觉算…

魅族手机怎么录屏?高清视频,轻松录制!

“有人知道魅族手机怎么录屏吗&#xff0c;新买的魅族手机&#xff0c;用了几天感觉挺流畅的&#xff0c;功能也很齐全&#xff0c;最近因为工作原因&#xff0c;需要用到录屏功能&#xff0c;但是我不知道怎么打开&#xff0c;就想问问大家&#xff0c;魅族手机怎么录屏呀。”…

2024 年 8 款值得收藏的免费 Android 数据恢复软件

如果你发现手机数据全部被删除&#xff0c;先别慌&#xff0c;今天这个视频就来教你如何恢复。 随着市场上数据恢复软件的可用性不断增加&#xff0c;很难选择哪一款是最好的。今天&#xff0c;我们精心挑选了8个最佳免费Android数据恢复软件。他们肯定会帮助你决定最适合你需…

JAVA对象、List、Map和JSON之间的相互转换

JAVA对象、List、Map和JSON之间的相互转换 1.Java中对象和json互转2.Java中list和json互转3.Java中map和json互转 1.Java中对象和json互转 Object obj new Object(); String objJson JSONObject.toJSONString(obj);//java对象转json Object newObj JSONObject.parseObject(…