Springboot怎么实现restfult风格Api接口

前言
在最近的一次技术评审会议上,听到有同事发言说:“我们的项目采用restful风格的接口设计,开发效率更高,接口扩展性更好...”,当我听到开头第一句,我脑子里就开始冒问号:项目里的接口用到的是restful风格的设计吗?restful风格的接口是怎么提高的开发效率?或者说这位同事对restful风格是不是有什么误解?于是乎,就有了这篇文章
restful是什么
rest是representational state transfer的缩写,翻译成中文的意思就是网络资源表述性状态转移。直译过来的内容真的很莫名其妙,有点看不懂。简单理解就是,传统的客户端与服务端资源交互接口中有资源状态的描述,restful风格的接口只有资源描述,关于状态的描述转移了,不包含在接口里了,更详细的内容接着往下看。
restful是web服务的一种架构设计风格和开发方式,本质是是一种设计思想和理念,并不是一种新技术,也不针对某一种编程语言,这种理念是在2000年的时候被一个叫Roy Fielding 的人提出来的。但是值得注意的是,rest并没有一个明确的标准,所以才被称之为一种设计风格,而这种设计风格倾向于更加简单轻量的web服务方法设计和实现。
restful的主要原则
虽然没有非常明确的标准,但是Roy Fielding 在提出这种设计理念的时候,也确定了一组架构约束条件和原则,只要满足这些约束条件和原则的应用程序或设计就可以称之为restful风格。restful主要的设计原则如下:
1、网络上的所有事物都被抽象为资源,如一张图片、一段文本,一条数据;
2、每个资源都有一个唯一的资源标识符,如URL;
3、同一个资源具有多种表现形式,即数据格式,如xml,json等;
4、对资源的各种操作不会改变资源标识符;
5、所有的操作都是无状态的,从客户端到服务端的每个请求都必须包含请求所必需的信息;
传统接口设计
本篇文章的主角是restful,而restful风格的设计实际是对传统接口交互的一种优化设计,那么这里简单回顾一下传统的http交互接口是如何设计的,以学生信息管理为例,传统接口通常是这样设计的:
1、查询学生信息列表,http://127.0.0.1:8080/student/queryList,请求方式为post;
2、查询学生信息详情,http://127.0.0.1:8080/student/queryDetail,请求方式为get;
3、保存学生信息,http://127.0.0.1:8080/student/add,请求方式为post;
4、更新学生信息,http://127.0.0.1:8080/student/update,请求方式为post;
5、删除学生信息,http://127.0.0.1:8080/student/del,请求方式为post;
restful风格接口设计
根据restful风格的设计原则,restful风格的接口通常是从这几个方面进行设计的:
1、资源定位描述设计:
restful风格的接口的每一个URL都代表一种资源,URL中只能有名词形式,不能有动词,名词能体现出操作资源的名称,完整的URL可以描述资源本身并且可以在计算机上定位到该资源;
2、资源操作设计:
资源描述设计中用 URL 定位资源,而对资源不同的操作动作,就用不同的http请求方式来表示,http的主要请求方式有get、post、put、delete;其中get表示从服务端获取资源,如查询类操作,post表示在服务端新建资源,如增加、保存类操作,put表示更新服务端上的资源,如更新操作,delete表示从服务端删除资源,如删除类操作;
3、返回状态码设计
restful风格接口的返回值状态码的设计和http状态码的设计保持一致,常用的http状态码如下:
200 – OK – 一切正常
201 – OK – 新的资源已经成功创建
204 – OK – 资源已经成功擅长
304 – Not Modified – 客户端使用缓存数据
400 – Bad Request – 请求无效,需要附加细节解释如 "JSON无效"
401 – Unauthorized – 请求需要用户验证
403 – Forbidden – 服务器已经理解了请求,但是拒绝服务或这种请求的访问是不允许的。
404 – Not found – 没有发现该资源
422 – Unprocessable Entity – 只有服务器不能处理实体时使用,比如图像不能被格式化,或者重要字段丢失。
500 – Internal Server Error – API开发者应该避免这种错误。
rest的直译意思是网络资源表述性状态转移,转移后的状态是什么样的呢?还以学生信息管理为例,采用restful风格的设计大概是这样的:
1、查询学生信息列表,http://127.0.0.1:8080/students,请求方式为get;
2、查询学生信息详情,http://127.0.0.1:8080/student/{id},请求方式为get;
3、保存学生信息,http://127.0.0.1:8080/student,请求方式为post;
4、更新学生信息,http://127.0.0.1:8080/student,请求方式为post;
5、删除学生信息,http://127.0.0.1:8080/student,请求方式为post;
如果是不同的客户端、版本的接口还可以这样区分:
1、查询学生信息列表,http://127.0.0.1:8080/web/v1/students,请求方式为get;
2、查询学生信息详情,http://127.0.0.1:8080/web/v1/student/{id},请求方式为get;
3、保存学生信息,http://127.0.0.1:8080/web/v1/student,请求方式为post;
4、更新学生信息,http://127.0.0.1:8080/web/v1/student,请求方式为post;
5、删除学生信息,http://127.0.0.1:8080/web/v1/student,请求方式为post;
从上面学生信息管理的相关restful风格的接口观察,restful风格的接口大概有以下3个特征:
1、每个URL只表述资源本身;
2、不同的请求方式表述对资源的操作;
3、客户端和服务端之间,传递资源的某种资源的表现层;
Springboot项目restful风格的接口示例
@RestController
public class StudentController {/*** 查询学生信息列表接口* @param param* @return*/@GetMapping("/students")public List<Student> studentList(Student param) {List<Student> result = new ArrayList<>();//列表查询业务逻辑return result;}/*** 查询学生详情信息接口* @param param* @return*/@GetMapping("/student")public Student detail(Student param) {Student student = new Student();//详情查询业务逻辑return student;}/*** 增加学生信息接口* @param student* @return*/@PostMapping("/student")public Student add(Student student) {//新增学生信息业务逻辑return student;}/*** 更新学生信息接口* @param student* @return*/@PutMapping("/student")public Student update(Student student) {//更新学生信息业务逻辑return student;}/*** 删除学生信息接口* @param student* @return*/@DeleteMapping("/student")public Student delete(Student student) {//删除学生信息业务逻辑return student;}
}restful风格设计的好处
1、URL本身有很强的可读性,具备自描述性;
2、强调http请求以资源为中心,规范了不同http请求方式的使用,具有对应的语义;
3、无状态的服务接口,可提高应用的扩展水平;
总结
restful的理念,本质上是用一种更加简单、清晰、便捷的方式,来定位、描述网络上的资源以及对这些资源的操作。具体在实操上,可能就仁者见仁,智者见智了。回头文章的开始,实际的项目接口的请求方式基本上是以post为主,get请求极少,put和delete请求根本没有,URL的命名实际上仍是传统的方式。restful对开发效率有明显的提升吗?我觉得未必,只不过接口定义看起来更简洁了,无形中开发效率会有一点点的提升,要说明显肯定是没有。
相关文章:
Springboot怎么实现restfult风格Api接口
前言在最近的一次技术评审会议上,听到有同事发言说:“我们的项目采用restful风格的接口设计,开发效率更高,接口扩展性更好...”,当我听到开头第一句,我脑子里就开始冒问号:项目里的接口用到的是…...
Jetpack Compose 深入探索系列六:Compose runtime 高级用例
Compose runtime vs Compose UI 在深入讨论之前,非常重要的一点是要区分 Compose UI 和 Compose runtime。Compose UI 是 Android 的新 UI 工具包,具有 LayoutNodes 的树形结构,它们稍后在画布上绘制其内容。Compose runtime 提供底层机制和…...
23.3.2 Codeforces Round #834 (Div. 3) A~E
FG明天补 A-Yes-Yes? 题面翻译 给定 ttt 个字符串,请判定这些字符串是否分别是 YesYesYesYes…\texttt{YesYesYesYes\dots}YesYesYesYes… 的子串。是则输出 YES,否则输出 NO(YES 和 NO 大小写不定)。 Translated by JYqwq …...
一次失败的面试经历:我只想找个工作,你却用面试题羞辱我!
金三银四近在咫尺,即将又是一波求职月,面对跳槽的高峰期,很多软件测试人员都希望能拿一个满意的高薪offer,但是随着招聘职位的不断增多,面试的难度也随之加大,而面试官更是会择优录取小王最近为面试已经焦头…...
java版工程管理系统 Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
java版工程管理系统Spring CloudSpring BootMybatis实现工程管理系统 工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和…...
附录3-大事件项目后端-项目准备工作,config.js,一些库的简易用法,main.js
目录 1 一些注意 2 创建数据库 3 项目结构 4 配置文件 config.js 5 参数规则包 hapi/joi与escook/express-joi 5.1 安装 5.2 文档中的demo 5.2.1 定义规则 5.2.2 使用规则 5.3 项目中的使用 5.3.1 定义信息规则 5.3.2 使用规则 6 密码加密包 bcrypt.…...
并发编程-线程
并发编程-线程 一个进程是操作系统中运行的一个任务,进程独立拥有CPU、内存等资源一个线程是一个进程中运行的一个任务,线程之间共享CPU、内存等资源,进程里的每一个任务都是线程。 线程创建 创建线程:使用threading模块中的Th…...
图解LeetCode——剑指 Offer 34. 二叉树中和为某一值的路径
一、题目 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。 二、示例 2.1> 示例 1: 【输入】root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...
使用Python免费试用最新Openai API
一、背景介绍 3月2日凌晨,OpenAI放出了真正的ChatGPT API,不是背后的GPT-3.5大模型,是ChatGPT的本体模型!ChatGPT API价格为1k tokens/$0.002,等于每输出100万个单词,价格才2.7美金(约18元人民…...
04、启动 SVN 服务器端程序
启动 SVN 服务器端程序1 概述2 用命令行单项目启动2.1 采用 svnserve 命令2.2 验证服务是否启动2.3 命令行方式的缺陷3 注册Windows服务3.1 注册服务的命令3.2 命令说明3.3 启动服务1 概述 SVN 服务器和 Tomcat 服务器,Nexus 服务器一样, 必须处于运行状态才能响应…...
jsp船舶引航计费网站Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP船舶引航计费网站是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...
Allegro如何画半圆形的线操作指导
Allegro如何画半圆形的线操作指导 在用Allegro设计PCB的时候,在某些应用场合会需要画半圆形,如下图 如何画半圆形,具体操作如下 点击Add点击Arc w/Radius...
【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】
一.知识回顾 之前的文章我们一起学习了MySQL面试必问系列之事务专题、锁专题,没有学习的小伙伴可以直接通过该链接地址直接访问,MYSQL你真的了解吗专栏的文章,接下来我们就一起来学习一下MySQL中SQL语句的执行流程,看看你掌握的怎…...
详解Linux下的环境变量以及C++库文件和头文件、python库的配置
目录 Linux环境变量配置基本步骤 1.查看环境变量 2.设置环境变量 3.永久性设置环境变量 4.使用环境变量 C 库文件和头文件环境变量配置 1.配置so库文件的环境变量 2.配置头文件的环境变量 Python库环境变量配置 Linux配置执行文件环境变量 我们都习惯在Windows 上配置…...
企业级分布式数据库 - GaussDB介绍
目录 什么是GaussDB 简介 应用场景 产品架构 产品优势 安全 责任共担 身份认证与访问控制 数据保护技术 审计与日志 监控安全风险 故障恢复 认证证书 GaussDB与其他服务的关系 约束与限制 计费模式 什么是GaussDB …...
Linux I2C 驱动实验
目录 一、Linux I2C 驱动简介 1、I2C 总线驱动 2、I2C 设备驱动 1、 i2c_client 结构体 2、 i2c_driver 结构体 二、硬件分析 三、设备树编写 1、pinctrl_i2c1 2、在 i2c1 节点追加 ap3216c 子节点 3、验证 四、 代码编写 1、makefile 2、ap3216c.h 3、ap3216c.c …...
DC-DC模块电源隔离直流升压高压稳压输出5v12v24v转60v100v110v150v220v250v300v400v500v
特点效率高达80%以上1*1英寸标准封装单电压输出稳压输出工作温度: -40℃~85℃阻燃封装,满足UL94-V0 要求温度特性好可直接焊在PCB 上应用HRB 0.2~10W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、9~18V、及18~36VDC标准&#…...
EF有几种模式,EF的三种模式分别是什么?
EF有几种模式,EF的三种模式分别是什么? 第一种:DataBase First DataBase First传统的表驱动方式创建EDM,然后通过EDM生成模型和数据层代码。除生成实体模型和自跟踪实现模型,还支持生成轻型DbContext。 解释…...
数据可视化展示:打工人常见职业病,颈腰椎病占比最高达66.51%
身体健康才是一切的根本。只有身体健健康康才能更好的去享受世间的美好,无论是谁都应当注重身体健康,而不是无度的挥霍它! 良好的身体,释放给工作,健壮的体魄,享受美好生活,良好的心态ÿ…...
【食品图像识别】Large Scale Visual Food Recognition
1 引言 视觉智能部与中科院计算所于2020-2021年度展开了《细粒度菜品图像识别和检索》科研课题合作,本文系双方联合在IEEE T-PAMI2023发布论文《Large Scale Visual Food Recognition》 (Weiqing Min, Zhiling Wang, Yuxin Liu, Mengjiang Luo, Liping Kang, Xiaom…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
