Spring Boot - Rest VS GraphQL

news2024/9/27 12:15:38

文章目录

  • 概述
  • 图解
  • Code
    • Spring Boot + Rest
    • Spring Boot + GraphQL

在这里插入图片描述


概述

REST(Representational State Transfer)和GraphQL都是用于构建Web服务的API设计和交互方式,它们有不同的特点和优劣势。

REST(Representational State Transfer)

  1. 架构风格:REST是一种架构风格,强调资源的状态和标识的分离,它通常基于HTTP协议来进行通信。

  2. 资源导向:REST API将应用程序的数据建模为一组资源,每个资源都有唯一的URL标识,例如/users/1表示用户1的信息。资源的操作通常使用HTTP动词来执行,如GET(获取资源)、POST(创建资源)、PUT(更新资源)和DELETE(删除资源)等。

  3. 状态无关:REST是无状态的,每个请求都包含足够的信息以处理该请求,服务器不需要存储客户端的状态。

  4. 数据传输:客户端通常不能选择要获取的数据,而是由服务器决定哪些数据返回给客户端。这可能导致过度或不足的数据传输。

  5. 版本控制:通常需要考虑API版本控制,以确保向后兼容性。

GraphQL

  1. 查询语言:GraphQL是一种查询语言,客户端可以精确指定需要获取的数据,并且不会获取多余的数据。客户端可以创建一个自定义的查询来获取所需的数据,这降低了过度传输数据的问题。

  2. 单一入口点:GraphQL通常只有一个入口点(通常是/graphql),客户端可以在单个请求中获取多个资源的数据。

  3. 强类型:GraphQL具有强类型系统,定义了可用的数据类型和查询结构,这有助于提前检测错误。

  4. 实时数据:GraphQL支持实时数据查询,允许客户端订阅数据的更改。

  5. 自描述:GraphQL APIs通常提供自描述的能力,客户端可以查询API的模式和文档,以便更好地理解如何构建查询。

  6. 版本管理:由于客户端可以选择要获取的字段,因此在某种程度上可以减少版本控制的需求,因为不会破坏现有客户端的查询。

选择REST还是GraphQL取决于您的项目需求和偏好。REST通常更简单,适用于简单的API,而GraphQL提供了更大的灵活性和效率,特别适用于复杂的数据查询和实时应用程序。根据项目的具体情况,您可以选择其中之一或将它们结合使用。

图解

在这里插入图片描述


Code

Spring Boot + Rest

在Spring Boot中整合REST,您可以使用Spring Web模块,它提供了用于构建RESTful Web服务的支持。下面是一个简单的示例工程:

  1. 创建一个Spring Boot项目,可以使用Spring Initializer或手动创建。

  2. 添加依赖,确保在pom.xml文件中包含以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. 创建一个REST控制器,例如:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, REST!";
    }
}
  1. 启动应用程序,访问http://localhost:8080/api/hello将返回"Hello, REST!"。

这就是一个简单的Spring Boot整合REST的示例工程。

Spring Boot + GraphQL

在Spring Boot中整合GraphQL,您可以使用第三方库(例如graphql-java和spring-graphql)。下面是一个简单的示例工程:

  1. 创建一个Spring Boot项目,可以使用Spring Initializer或手动创建。

  2. 添加依赖,确保在pom.xml文件中包含以下依赖:

<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>11.1.0</version>
</dependency>
<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphiql-spring-boot-starter</artifactId>
    <version>11.1.0</version>
    <scope>runtime</scope>
</dependency>
  1. 创建GraphQL模式和查询,例如:
# src/main/resources/graphql/schema.graphqls
type Query {
    hello: String
}
import graphql.schema.DataFetcher;
import graphql.schema.GraphQLSchema;
import graphql.schema.StaticDataFetcher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GraphQLConfig {

    @Bean
    public GraphQLSchema schema() {
        return GraphQLSchema.newSchema()
                .query(queryType())
                .build();
    }

    @Bean
    public GraphQLQueryResolver queryType() {
        return new GraphQLQueryResolver() {
            public String hello() {
                return "Hello, GraphQL!";
            }
        };
    }
}
  1. 启动应用程序,访问http://localhost:8080/graphiql可以使用图形化界面测试GraphQL查询,或者通过POST请求http://localhost:8080/graphql发送查询。

这就是一个简单的Spring Boot整合GraphQL的示例工程,它允许您定义自己的GraphQL模式和查询,并通过HTTP端点进行查询。

在这里插入图片描述

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

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

相关文章

PHP自己的框架2.0加载控制器并运行(重构篇四)

目录 1、加载控制器并运行 2、创建admin和index模块控制器 3、自动加载控制器文件 4、运行控制器中方法 5、运行模块下控制器方法 1、加载控制器并运行 2、创建admin和index模块控制器 <?php namespace app\admin\controller; class index{public function index(){ech…

【pytest】生成测试报告

0. 脚本&#xff1a; fixture/test_fixtures_02.py # 功能函数 import pytestdef multiply(a, b):return a * bclass TestMultiply:# fixturesclassmethoddef setup_class(cls):print("setup_class>")classmethoddef teardown_class(cls):print("teardown_c…

在PHP8中对数组进行计算-PHP8知识详解

在php8中&#xff0c;提供了丰富的计算函数&#xff0c;可以对数组进行计算操作。常见的计算函数如下几个&#xff1a;array_sum()函数、array_merge()函数、array_diff()函数、array_diff_assoc()函数、array_intersect()函数、array_intersect_assoc()函数。 1、array_sum()函…

MySQL数据库——MySQL8.0.26-Linux版安装

目录 准备Linux服务器 下载安装包 上传安装包 创建目录,并解压 安装mysql的安装包 启动MySQL服务 查询自动生成的root用户密码 修改root用户密码 创建用户 并给root用户分配权限 通过DataGrip远程连接MySQL 准备Linux服务器 云服务器或者虚拟机&#xff0c; Linux…

P2P协议的传输艺术

TP 采用两个 TCP 连接来传输一个文件。 控制连接&#xff1a;服务器以被动的方式&#xff0c;打开众所周知用于 FTP 的端口 21&#xff0c;客户端则主动发起连接。该连接将命令从客户端传给服务器&#xff0c;并传回服务器的应答。常用的命令有&#xff1a;list——获取文件目…

图解曲面积分的对称性

1.图解曲面积分的对称性 1.1 第一类曲面积分的一般对称性 二重积分、三重积分、第一类曲线积分、第一类曲面积分的一般对称性其原理都类似 平面和空间曲面的原理一样&#xff0c;以下内容以空间曲面为例 图中所示为积分区域 Σ \Sigma Σ&#xff0c;函数 f ( x , y , z ) f(…

PostgreSQL缓存管理

缓冲区管理器、存储和后端进程之间的关系 缓存管理结构 PostgreSQL 缓冲区管理器由buffer table、buffer descriptors和buffer pool组成。buffer pool层存储表和索引等数据文件页&#xff0c;以及空闲空间映射和可见性映射。buffer pool是一个数组&#xff0c;每个槽存储数据文…

Redis RedLock算法和底层源码分析

Redlock红锁算法 官网地址&#xff1a;Distributed Locks with Redis | Redis 为什么要使用RedLock&#xff1f; 解释&#xff1a; 线程 1 首先获取锁成功&#xff0c;将键值对写入 redis 的 master 节点&#xff0c;在 redis 将该键值对同步到 slave 节点之前&#xff0c;mas…

vue+express、gitee pm2部署轻量服务器

一、代码配置 前后端接口都保持 127.0.0.1:3000 vue创建文件 pm2.config.cjs module.exports {apps: [{name: xin-web, // 应用程序的名称script: npm, // 启动脚本args: run dev, // 启动脚本的参数cwd: /home/vue/xin_web, // Vite 项目的根目录interpreter: none, // 告诉…

java基础-并发编程-CountDownLatch(JDK1.8)源码学习

CountDownLatch方法调用与类关系图 一、初始化&#xff1a;public CountDownLatch(int count) public CountDownLatch(int count) {if (count < 0) throw new IllegalArgumentException("count < 0");this.sync new Sync(count);}Sync(int count) {// 将参数…

pte初步认识学习

我们的时间的确很少&#xff0c;但是我们每天都乐意将珍贵的时间浪费在大量毫无意义的事情上 目录 pte介绍 PTE口语评分规则 pte架构 计算机科学23 QS排名 《芭比》 pte介绍 PTE口语评分规则 有抑扬顿挫 对于连读 不能回读 native pte对于个别单词没有读好&#xff0c…

JSP 学习笔记(基础)

出现背景&#xff1a; 由于 Servlet 输出 HTML 比较困难&#xff0c;所以出现了 JSP 这个代替品。 特点&#xff1a; 基于文本&#xff0c;HTML 和 Java 代码共同存在&#xff08;用 write() 来写 HTML 标签&#xff09;其本身就是个被封装后的 Servlet&#xff08;被编译为…

JavaScript的BOM操作

一、BOM 1.认识BOM BOM&#xff1a;浏览器对象模型&#xff08;Browser Object Model&#xff09; 简称 BOM&#xff0c;由浏览器提供的用于处理文档&#xff08;document&#xff09;之外的所有内容的其他对象&#xff1b;比如navigator、location、history等对象&#xff…

Android 使用Camera1实现相机预览、拍照、录像

1. 前言 本文介绍如何从零开始&#xff0c;在Android中实现Camera1的接入&#xff0c;并在文末提供Camera1Manager工具类&#xff0c;可以用于快速接入Camera1。 Android Camera1 API虽然已经被Google废弃&#xff0c;但有些场景下不得不使用。 并且Camera1返回的帧数据是NV21…

JSP ssm 零配件管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm 零配件管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

ThinkPHP 5.0通过composer升级到5.1,超级简单

事情是这样的&#xff0c;我实现一个验证码登录的功能&#xff0c;但是这个验证码的包提示tp5的版本可以是5.1.1、5.1.2、5.1.3。但我使用的是5.0&#xff0c;既然这样&#xff0c;那就升个级呗&#xff0c;百度了一下&#xff0c;结果发现大部分都是讲先备份application和修改…

python之pyQt5实例:PyQtGraph的应用

1、显示逻辑 "MainWindow": "这是主窗口&#xff0c;所有的其他组件都会被添加到这个窗口上。", "centralwidget": "这是主窗口的中心部件&#xff0c;它包含了其他的部件。","pushButton": "这是一个按钮&#xff0c…

算法刷题 week3

这里写目录标题 1.重建二叉树题目题解(递归) O(n) 2.二叉树的下一个节点题目题解(模拟) O(h) 3.用两个栈实现队列题目题解(栈&#xff0c;队列) O(n) 1.重建二叉树 题目 题解 (递归) O(n) 递归建立整棵二叉树&#xff1a;先递归创建左右子树&#xff0c;然后创建根节点&…

贪心算法的思路和典型例题

一、贪心算法的思想 贪心算法是一种求解问题时&#xff0c;总是做出在当前看来是最好的选择&#xff0c;不从整体最优上加以考虑的算法。 二.用贪心算法的解题策略 其基本思路是从问题的某一个初始解出发一步一步地进行&#xff0c;根据某个优化测度&#xff0c;每一步都要确保…

Idea 下载不了源码 cannot download source

一、打开Terminal (AltF12)&#xff0c;找到项目具体模块所在的文件夹&#xff0c;输入一下指令 mvn dependency:resolve -Dclassifiersources 如果你的idea 终端无法使用mvn指令&#xff0c;要配置你idea中的maven的环境变量&#xff1a; 1、找到maven在idea中的位置&#xf…