当前位置: 首页 > news >正文

【Spring Boot】详解restful api

目录

1.restful api

1.1.历史

1.2.内容

1.3.传参

2.Spring Boot中的Restful Api


1.restful api

1.1.历史

RESTful API(Representational State Transferful Application Programming Interface)是一种设计风格,用于构建基于网络的应用程序接口(API)。它基于一组原则和约定,旨在使不同的计算机系统能够通过 HTTP 协议相互通信和交换数据。

RESTful 架构风格的历史可以追溯到 2000 年,由 Roy Fielding 在他的博士论文 "Architectural Styles and the Design of Network-based Software Architectures" 中首次提出。他在论文中描述了 REST(Representational State Transfer)的概念,并介绍了一组原则和约定,用于设计和构建分布式网络应用程序。

以下是 RESTful 架构风格的主要历史发展阶段:

  1. 博士论文(2000 年):Roy Fielding在他的博士论文中首次提出了 REST 的概念。他强调了分布式系统设计中资源的重要性,以及通过使用统一接口和状态转移的方式来实现系统的可伸缩性、性能和可扩展性。

  2. Web 2.0 时代(2000 年代中期):随着 Web 的发展,REST 开始获得更多关注。许多 Web 2.0 应用程序采用了 RESTful 架构,使其能够更有效地交换数据和与客户端进行通信。

  3. 移动应用的兴起(2010 年代):随着智能手机和移动应用的兴起,RESTful API 成为连接移动客户端与后端服务的主要方式。许多社交媒体、电子商务和其他类型的应用程序开始采用 RESTful 架构。

  4. 微服务架构(2010 年代后期至今):RESTful API 也在微服务架构中得到广泛应用。微服务架构通过将应用程序拆分为小型、独立的服务来提高可维护性和可伸缩性,而 RESTful API 则成为这些服务之间通信的一种标准方式。

1.2.内容

RESTful API总结起来内容如下:

  1. 资源和标识符:在 RESTful API 中,每个资源都有一个唯一的标识符(URI),用于唯一标识该资源。资源可以是实际对象、数据、服务等。

  2. 统一接口:RESTful API 使用统一的 HTTP 方法(GET、POST、PUT、DELETE 等)来执行操作,如获取资源、创建资源、更新资源和删除资源。

  3. 状态无关性:RESTful API 是无状态的,每个请求都应该包含足够的信息来理解和处理请求,而不需要维护会话状态。

  4. 缓存:RESTful API 支持缓存,可以提高性能和减少网络流量。

  5. 客户端-服务器:RESTful API 将客户端和服务器解耦,使它们可以独立进行开发和扩展。

  6. 分层系统:RESTful API 支持分层系统架构,其中每个层都可以独立修改和优化,从而提高了系统的灵活性和可伸缩性。

  7. 按需代码:服务器可以在需要时将代码传送到客户端,以实现功能的扩展。

  8. 面向资源:RESTful API 设计应该围绕资源进行,而不是围绕操作进行。

  9. 自描述消息:RESTful API 的请求和响应消息应该是自描述的,使开发者能够理解其含义。

以上的所有内容,其核心其实就一个就是第2点,使用统一的 HTTP 方法(GET、POST、PUT、DELETE 等)来执行操作,如获取资源、创建资源、更新资源和删除资源。

以对用户的增删改查为例,rest api总结起来就是:

HTTP方法URL功能
GET/user获取用户
POST/user增加用户
PUT/user修改用户
DELETE/user删除用户

1.3.传参

rest api规范中对传参没有强制规定,但是有一些工程实践总结出来的优秀经验,常用的传参方式如下

  1. URL 路径参数:将参数直接包含在 URL 路径中。这通常用于标识资源的唯一标识符,如获取特定用户的信息。

    示例:GET /users/{id}

  2. 查询字符串参数:将参数作为查询字符串的一部分包含在 URL 中。这用于传递过滤条件、分页信息等。

    示例:GET /users?role=admin&page=1&limit=10

  3. 请求体参数:将参数包含在请求体中,通常在创建或更新资源时使用。数据通常以 JSON 或 XML 格式发送。

    示例:

    • POST /users,请求体:{"username": "john", "email": "john@example.com"}

    • PUT /users/{id},请求体:{"email": "newemail@example.com"}

2.Spring Boot中的Restful Api

Spring MVC中本身就自带

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

这些注解可以轻松实现Restful api,唯一需要注意的就是传参。

Spring Boot支持Restful Api将参数放在路径里:

@GetMapping("/user/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {// 根据 id 查询用户信息并返回
}

如果参数太多,支持放在http报文的body里:

@PostMapping("/user")
public ResponseEntity<User> createUser(@RequestBody User user) {// 创建用户并返回创建后的用户信息
}

Rest Api规范里建议要给出规范的响应码,Spring Boot里提供了ResponseEntity 类来构建响应,可以设置状态码、头部信息和响应体。

@GetMapping("/user/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {User user = userService.getUserById(id);if (user != null) {return ResponseEntity.ok(user);} else {return ResponseEntity.notFound().build();}
}

相关文章:

【Spring Boot】详解restful api

目录 1.restful api 1.1.历史 1.2.内容 1.3.传参 2.Spring Boot中的Restful Api 1.restful api 1.1.历史 RESTful API&#xff08;Representational State Transferful Application Programming Interface&#xff09;是一种设计风格&#xff0c;用于构建基于网络的应用…...

LISTAGG 函数

# LISTAGG 函数 对于查询中的每个组&#xff0c;LISTAGG 聚合函数根据 ORDER BY 表达式对该组的行进行排序&#xff0c;然后将值串联成一个字符串。 ## 语法: sql LISTAGG( [DISTINCT] aggregate_expression [, delimiter ] ) [ WITHIN GROUP (ORDER BY order_list) ] …...

485modbus转profinet网关连三菱变频器modbus通讯配置案例

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式&#xff0c;使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关&#xff0c;用户可以有效地管理和监控设备&#xff0c;从…...

1024节日

程序员节日...

【@EnableWebMvc的原理】

用途 启用SpringMvc 的 Java 配置类&#xff0c;代替 xml 格式的配置文件。 一、查看运用&#xff08;注解 EnableWebMvc &#xff0c;实现 WebMvcConfigurer &#xff09; Component("com.ibicd") EnableWebMvc public class AppConfig implements WebMvcConfigu…...

css3 2d转换transform详细解析与代码实例transform

CSS3 Transform是CSS3的一个模块&#xff0c;其目的是为了通过对元素的变形、旋转、缩放、平移等操作&#xff0c;能够更加丰富的展示页面效果。下面是CSS3 Transform的详细解析与代码实例&#xff1a; transform属性 transform属性用于对元素进行变形操作&#xff0c;其属性…...

点亮现代编程语言的男人——C语言/UNIX之父Dennis Ritchie

祝各位程序员们1024程序员节快乐&#x1f389;&#x1f389;&#x1f389; 图片来自网络&#xff0c;侵删 前言 在程序员中&#xff0c;有一位人物的不被人熟知&#xff0c;他的贡献甚至比他自身更要出名 C语言之父&#xff0c;UNIX之父——Dennis MacAlistair Ritchie 一…...

找不到msvcp100.dll解决教程

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp100.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍四个修复msvcp100.dll丢失的方法&#xff0c;帮助读者快速恢复计算机的正常运…...

萃取和constexpr

最近重温了一下萃取发现其与constexpr有相似之处&#xff0c;记录如下。 一、引出萃取 STL的在中心思想是将容器和算法分开&#xff0c;再通过迭代器iterator这一迭代器来将两者粘合起来。 通过迭代器进行算法计算&#xff0c;需要涉及两个问题&#xff1a; 问题一.通常需要…...

决策树完成图片分类任务

数据集要求&#xff1a; 训练集 和 验证集 &#xff08;要求分好&#xff09; 图片放置规则 &#xff1a; 一个总文件夹 放类别名称的子文件夹 其中子文件夹 为存放同一类别图片 举个例子 分类动物 则 总文件夹名称为动物 子文件夹为 猫 狗 猪猪 。。。 其中猫的文件夹里面…...

Docker 容器全部停止命令

Docker是一个开源的容器化平台&#xff0c;它可以帮助开发者快速构建、部署和运行应用程序。在使用Docker时&#xff0c;我们通常会创建多个容器来运行不同的服务或应用。当我们需要停止所有的容器时&#xff0c;可以使用一些命令来实现。本文将介绍几种常见的停止所有Docker容…...

对GRUB和initramfs的小探究

竞赛时对操作系统启动过程产生了些疑问&#xff0c;于是问题导向地浅浅探究了下GRUB和initramfs相关机制&#xff0c;相关笔记先放在这里了。 内核启动流程 在传统的BIOS系统中&#xff0c;计算机具体的启动流程如下&#xff1a; 电源启动&#xff1a;当计算机的电源打开时&…...

springboo单机多线程高并发防止重复消费的redis方案

springboo单机多线程高并发防止重复消费的redis方案 仅提供方案与测试。 想法&#xff1a;第一次收到userCode时&#xff0c;检查是否在redis中有&#xff0c;如果有&#xff0c;就表明已经消费了&#xff0c;返回抢单失败&#xff1b;否则&#xff0c;就去消费&#xff0c;顺…...

Java架构师内功数据库

目录 1 导学2 数据库基本概念2.1 数据库系统2.2 三级模式-两级映像2.3 数据库设计2.4 数据模型2.4.1 E-R模型2.4.2 关系模型2.5 关系代数3 规范化和并发控制3.1 函数依赖3.2 键与约束3.3 范式3.3.1 第一范式1NF3.3.2 第二范式3.3.3 第三范式3.4 模式分解3.5 并发控制3.6 封锁协…...

踩着节日的小尾巴

节日快乐...

UG\NX二次开发 设置视图中心 UF_VIEW_set_center

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a1794902437 订阅本专栏,非常感谢。 简介 UG\NX二次开发 设置视图中心 UF_VIEW_set_center。如果视图NULL_TAG,则使用工作视图。 效果 代码 #include &qu…...

leetcode做题笔记201. 数字范围按位与

给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;left 5, right 7 输出&#xff1a;4示例 2&#xff1a; 输入&…...

游戏盾如何有效防护DDoS

从进入计算机时代以来&#xff0c;DDoS攻击一直是网络世界中的一大威胁&#xff0c;让无数服务陷入瘫痪。这种攻击的原理非常简单&#xff1a;攻击者使用大量的僵尸主机或蠕虫病毒&#xff0c;向目标服务器发送海量请求&#xff0c;迅速耗尽服务器的资源&#xff0c;使其无法继…...

JavaScript中的类型转换

将值从一种类型转换为另一种类型&#xff0c;a -> ‘a’ ,称为类型转换。转换分为两种&#xff0c;一种显式的&#xff0c;一种隐式的&#xff0c;隐式的往往也是强制类型转换。强制类型转换总是返回标量基本类型&#xff0c;不会返回对象和函数。 如何区分&#xff1f; 类型…...

01-JVM 内存结构

JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分&#xff1a; 程序计数器Java 虚拟机栈本地方法栈堆方法区 JDK 1.8 同 JDK 1.7 比&#xff0c;最大的差别就是&#xff1a;元数据区取代了永久代。元空间的本质和永久代类似&#xff0c;都是对 JVM 规范中方法区的实现。不过…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...