GraphQL入门实战

news2024/11/24 9:08:48

解决什么问题

根据请求控制返回结果

例如: 一个User对象,有id,name,mobile,email

有些接口只要返回id,name ,有些接口还要要返回 mobile

适用场景

  • 弱文档管理,公司对文档要求不高
  • 需求复杂变化快
  • 单资源多种访问方式,组件复用
  • 复杂API 还是restful好

开发流程

1.设计领域对象

2.定义GraphQL Schema

3.定义DataFetcher(实现数据访问层组件)

4.完成Data Wiring(GraphQlSourceBuilderCustomizer,旧版本RuntimeWiringBuilderCustomizer)

5.开启graph配置或者自己实现Controller

 spring.graphql.schema.printer.enabled=true

 spring.graphql.path=/wenl/query

GraphQL Server实例

前提

spring boot 2.7+,JDK1.8,maven 3.5+

maven pom如下:

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.13-SNAPSHOT</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<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>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webflux</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.graphql</groupId>
			<artifactId>spring-graphql-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
	</dependencies>
   <build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>3.1.0</version>
			</plugin>
		</plugins>
	</build>

设计领域对象

@Data
public class Author {

    private Long id;

    private String firstName;

    private String lastName;
}
@Data
@NoArgsConstructor
public class Book {

    private String id;

    private String name;

    private int pageCount;

    private Author author;

    public static List<Book> books = Arrays.asList(
            new Book("book-1", "Effective Java", 416, "author-1"),
            new Book("book-2", "Hitchhiker's Guide to the Galaxy", 208, "author-2"),
            new Book("book-3", "Down Under", 436, "author-3")
    );

    public Book(String id, String name, int pageCount, String authorName) {
        this.id = id;
        this.name = name;
        this.pageCount = pageCount;
        Author author = new Author();
        author.setFirstName(authorName);
        author.setLastName("lastName");
        this.author=author;
    }
}

定义GraphQL Schema

文件位置固定文件名固定,resources/graphql/schema.graphqls

schema {
    query : Query
}

type Query {
    books: [Book]
    bookById(id: String,name: String ): Book
}

type Book {
    id: ID
    name: String
    pageCount: Int
    author: Author
}

type Author {
    id: ID
    firstName: String
    lastName: String
}

schema 是固定写法

type Query  内部是对应的查询方法。

books: [Book] 表示方法名称为books(client需要配置) ,返回的是list


bookById(id: String,name: String ): Book   这里返回单个Book,id,name是参数

其他的type 是返回值的类。

定义DataFetcher(实现数据访问层组件)

@Component
public class BookDataFetcher implements DataFetcher<Book> {

    @Override
    public Book get(DataFetchingEnvironment dataFetchingEnvironment) throws Exception {
        String id = (String) dataFetchingEnvironment.getArguments().get("id");
        String name = (String) dataFetchingEnvironment.getArguments().get("name");
        return Book.books.stream().filter(book -> book.getId().equals(id)&&book.getName().equals(name)).findFirst().orElse(null);
    }
    
}
@Component
public class BooksDataFetcher implements DataFetcher<List<Book>> {

    @Override
    public List<Book> get(DataFetchingEnvironment dataFetchingEnvironment) throws Exception {
        return Book.books;
    }
    
}

完成Data Wiring(GraphQlSourceBuilderCustomizer,旧版本RuntimeWiringBuilderCustomizer)

@Component
public class CustomerStaffDataWiring implements GraphQlSourceBuilderCustomizer {
    @Autowired
    private BooksDataFetcher booksDataFetcher;
    @Autowired
    private BookDataFetcher bookDataFetcher;
    
    @Override
    public void customize(GraphQlSource.SchemaResourceBuilder builder) {
        builder.configureRuntimeWiring(new RuntimeWiringConfigurer() {
            @Override
            public void configure(RuntimeWiring.Builder builder) {
                builder.type("Query", typeWiring -> typeWiring
                                .dataFetcher("books", booksDataFetcher)
                        .dataFetcher("bookById",bookDataFetcher)
                );
            }
        });
    }
}

开启graph配置或者自己实现Controller

 spring.graphql.schema.printer.enabled=true

 spring.graphql.path=/wenl/query

自实现Controller

@RestController
public class BookController {
    private GraphQL graphQL;

    @Autowired
    public BookController(GraphQlSource graphQlSource) {
        graphQL = graphQlSource.graphQl();
    }
    @Data
    public static class GraphQLInput{
        String query;
        Map<String,Object> variables;
    }
    @PostMapping(value = "/wenl/query")
    public ResponseEntity<Object> query(@RequestBody GraphQLInput graphQLInput) {
        ExecutionInput.Builder executionInputBuilder = new ExecutionInput.Builder();
        executionInputBuilder.query(graphQLInput.getQuery());
        executionInputBuilder.variables(graphQLInput.getVariables());
        ExecutionResult result = graphQL.execute(executionInputBuilder);
        return ResponseEntity.ok(result.getData());
    }
}

GraphQL Client 调用方式

就是简单的POST 调用json方式,下面就使用Apifox 说明

返回值如下:

调用JSON说明

{
    "query":"query books($id:String,$name:String){ bookById(id:$id,name:$name){ id name pageCount author { firstName  }}}",
    "variables":{
        "id":"book-1",
        "name":"Effective Java"
    }
}

$id,$name 表示参数

query,variables与GraphQLInput 字段一一对应。

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

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

相关文章

【JavaEE进阶】springBoot热部署、请求转发与重定向

目录 一、SpringBoot热部署 1.1热部署的步骤 1.1.1导入maven中央仓库的jar包 1.1.2开启项目自动编译 1.1.3启动项目 1.2热部署的原理 二、请求转发&重定向 2.1关键字不一样 2.2定义不同 请求转发(forward)&#xff1a; 请求重定向(redirect): 2.3数据共享不一样…

如何用MASM32开发Windows应用程序

提醒&#xff1a;以下内容仅做参考&#xff0c;可自行发散。在发布作品前&#xff0c;请把不需要的内容删掉。IT技术日异月异&#xff0c;无论是初学者还是有经验的专业人士&#xff0c;都需要与时俱进&#xff0c;不断学习新技术。在学习一门新的IT技术时&#xff0c;都需要采…

Github自定义个人首页

前言 GitHub 个人主页&#xff0c;官方称呼是 profile&#xff0c;是一个以 Markdown 脚本语言编写的个人 GitHub 展示主页面。Guthub 个人主页可以展示很多有用的信息&#xff0c;例如添加一个首页被访问次数的计数器&#xff0c;一个 Github 被 Star 与 Commit 的概览信息&a…

JVM-学习笔记

一 . JVM架构图 JVM是Java Virtual Machine的简称&#xff0c;意为Java虚拟机。JVM有很多种&#xff0c;使用最为广泛的JVM为HotSpot。 如上面架构图所示&#xff0c;JVM分为三个主要子系统&#xff1a; 类加载器子系统&#xff08;Class Loader Subsystem&#xff09; 运行…

Linux命令学习之cp和mv

cp man 1 cp可以看一下cp的帮助说明。 cp -r /learnwell/good/ /tmp把good目录复制到/tmp目录下&#xff0c;注意想要复制目录&#xff0c;一定要加上-r选项。 接下来学习复制文件&#xff0c;cp 源文件 目标目录&#xff08;相对路径方法&#xff09;或者是cp /源文件所在目…

华为OD机试题【IPv4地址转换成整数】【2023 B卷 100分】

文章目录 &#x1f3af; 前言&#x1f3af; 题目描述&#x1f3af; 解题思路示例 1示例 2&#x1f4d9; Python代码实现&#x1f4d7; Java代码实现&#x1f4d8; C语言代码实现 &#x1f3af; 前言 &#x1f3c6; 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为…

Spark安装和编程实践(Spark2.4.0)

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装&#xff08;单机、伪分布&#xff09; Hadoop集群搭建 HBase2.2.2安装&#xff08;单机、伪分布&#xff09; Zookeeper集群搭建 HBase集群搭建 Spark安装和编程实践&#xff08;Spark2.4.0&#xff09; Spark集群搭建 文章目…

linux(信号产生的各种方式)

目录&#xff1a; 1.引入 2.介绍系统支持的信号列表 3.键盘方式产生信号 4.程序中存在异常问题&#xff0c;产生信号 5.系统调用产生信号 6.软件条件也能产生信号 7.任何理解OS给进程发送信号 1.引入 我怎么证明ctrlc是向指定进程发送了2号信号呢&#xff1f;&#xff1f; sig…

5万字大数据实验室建设方案能源大数据中心建设方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除篇幅有限&#xff0c;无法完全展示&#xff0c;喜欢资料可转发评论&#xff0c;私信了解更多信息。 大数据实验室建设方案 大数据实验室建设方案 目录 1概述 1.1建设背景 1.…

chatgpt赋能python:Python抓取数据:从入门到精通

Python抓取数据&#xff1a;从入门到精通 Python是当下最热门的编程语言之一&#xff0c;其强大的数据处理能力使得Python在数据抓取方面也越来越受欢迎。本文将从入门到精通介绍Python抓取数据的方法&#xff0c;希望对初学者有所帮助。 网络爬虫 网络爬虫是Python基于网络…

CG平台实验——线性回归

文章目录 练习1&#xff1a;线性回归介绍1 实现简单示例函数1.1 提交解决方案 2 单变量线性回归2.1 绘制数据2.2 梯度下降2.2.1 更新公式2.2.2 实现2.2.3 计算成本J(θ)2.2.4 梯度下降 2.3 可视化成本函数 选做练习3 多变量线性回归3.1 特征标准化3.2 梯度下降 练习1&#xff1…

chatgpt赋能python:Python在边框中写文字:优雅展示内容的方式

Python在边框中写文字&#xff1a;优雅展示内容的方式 当我们需要在网页上展示一些信息时&#xff0c;通常会使用边框来突出显示内容&#xff0c;然而&#xff0c;普通的边框可能会显得过于单调&#xff0c;缺少设计感&#xff0c;这时我们可以借助Python来实现一个功能强大的…

chatgpt赋能python:Python备份列表:从小白到大神,这里有你需要的一切

Python备份列表&#xff1a;从小白到大神&#xff0c;这里有你需要的一切 随着信息科技的发展&#xff0c;数字资料的价值越发具有现实意义&#xff0c;但是数据泄露、系统崩溃、病毒攻击、硬件故障等情况也时有发生。因此&#xff0c;对数据进行备份是非常必要的。Python作为…

Select选择器(antd-design组件库)简单使用以及增加搜索功能

1.Select选择器 下拉选择器。 2.何时使用 弹出一个下拉菜单给用户选择操作&#xff0c;用于代替原生的选择器&#xff0c;或者需要一个更优雅的多选器时。 当选项少时&#xff08;少于 5 项&#xff09;&#xff0c;建议直接将选项平铺&#xff0c;使用 Radio 是更好的选择。 组…

chatgpt赋能python:Python如何倒序输出列表

Python如何倒序输出列表 Python是一种高级编程语言&#xff0c;自由、开源、跨平台&#xff0c;被广泛用于Web开发、数据分析、机器学习等领域。在Python中&#xff0c;列表是一种常见的数据结构&#xff0c;它允许存储多个元素&#xff0c;并支持索引、切片等操作。本文将介绍…

chatgpt赋能python:Python如何保存文件-最全面的指南

Python如何保存文件 - 最全面的指南 Python是一种强大的编程语言&#xff0c;它在处理文本文件、CSV文件、Excel文件、图像文件和PDF文件等方面表现出色。然而&#xff0c;如何在Python中保存这些文件&#xff0c;对于初学者来说可能会有些棘手。在本篇文章中&#xff0c;我们…

自建极简Ethercat主站-底层驱动编写

1、简介 MECM&#xff08;Mini Ethercat Master&#xff09;,名字随便起的。已经学习了一段时间的Ethercat总线了&#xff0c;目前的想法就是自己简单实现一个Ethercat主站&#xff0c;没有太多的冗余功能&#xff0c;暂时不考虑太多的容错机制&#xff0c;仅实现目前用到的FO…

chatgpt赋能python:Python奇偶求和:简单实用的算法

Python奇偶求和&#xff1a;简单实用的算法 Python作为一门高级编程语言&#xff0c;不仅适用于数据分析及科学计算领域&#xff0c;也可用于日常生活中的实用问题。例如&#xff0c;人们常常需要对一个整数序列中的奇数和偶数进行求和&#xff0c;以便了解各自的总数或者对它…

【软件测试】测试经验:IT 软件测试技术系统化学习方法

目录 一、IT 软件测试技术的介绍 &#xff08;1&#xff09;相关职称证书 ① 「中级」软件评测师 ②「高级」项目管理师 &#xff08;2&#xff09;背景 &#xff08;3&#xff09;作用 &#xff08;4&#xff09;行业应用 &#xff08;5&#xff09;技术概况 二、…

ES数据库介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 前言 一、ES(ElasticSearch)是什么&#xff1f; 二、ES的使用场景 三、ES的特点 四、ES和传统数据库对比 总结 前言 今天项目通过python用到了ES数据库…