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

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接口

前言在最近的一次技术评审会议上&#xff0c;听到有同事发言说&#xff1a;“我们的项目采用restful风格的接口设计&#xff0c;开发效率更高&#xff0c;接口扩展性更好...”&#xff0c;当我听到开头第一句&#xff0c;我脑子里就开始冒问号&#xff1a;项目里的接口用到的是…...

Jetpack Compose 深入探索系列六:Compose runtime 高级用例

Compose runtime vs Compose UI 在深入讨论之前&#xff0c;非常重要的一点是要区分 Compose UI 和 Compose runtime。Compose UI 是 Android 的新 UI 工具包&#xff0c;具有 LayoutNodes 的树形结构&#xff0c;它们稍后在画布上绘制其内容。Compose runtime 提供底层机制和…...

23.3.2 Codeforces Round #834 (Div. 3) A~E

FG明天补 A-Yes-Yes? 题面翻译 给定 ttt 个字符串&#xff0c;请判定这些字符串是否分别是 YesYesYesYes…\texttt{YesYesYesYes\dots}YesYesYesYes… 的子串。是则输出 YES&#xff0c;否则输出 NO&#xff08;YES 和 NO 大小写不定&#xff09;。 Translated by JYqwq …...

一次失败的面试经历:我只想找个工作,你却用面试题羞辱我!

金三银四近在咫尺&#xff0c;即将又是一波求职月&#xff0c;面对跳槽的高峰期&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取小王最近为面试已经焦头…...

java版工程管理系统 Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

java版工程管理系统Spring CloudSpring BootMybatis实现工程管理系统 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和…...

附录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.…...

并发编程-线程

并发编程-线程 一个进程是操作系统中运行的一个任务&#xff0c;进程独立拥有CPU、内存等资源一个线程是一个进程中运行的一个任务&#xff0c;线程之间共享CPU、内存等资源&#xff0c;进程里的每一个任务都是线程。 线程创建 创建线程&#xff1a;使用threading模块中的Th…...

图解LeetCode——剑指 Offer 34. 二叉树中和为某一值的路径

一、题目 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。 二、示例 2.1> 示例 1&#xff1a; 【输入】root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...

使用Python免费试用最新Openai API

一、背景介绍 3月2日凌晨&#xff0c;OpenAI放出了真正的ChatGPT API&#xff0c;不是背后的GPT-3.5大模型&#xff0c;是ChatGPT的本体模型&#xff01;ChatGPT API价格为1k tokens/$0.002&#xff0c;等于每输出100万个单词&#xff0c;价格才2.7美金&#xff08;约18元人民…...

04、启动 SVN 服务器端程序

启动 SVN 服务器端程序1 概述2 用命令行单项目启动2.1 采用 svnserve 命令2.2 验证服务是否启动2.3 命令行方式的缺陷3 注册Windows服务3.1 注册服务的命令3.2 命令说明3.3 启动服务1 概述 SVN 服务器和 Tomcat 服务器&#xff0c;Nexus 服务器一样, 必须处于运行状态才能响应…...

jsp船舶引航计费网站Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP船舶引航计费网站是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…...

Allegro如何画半圆形的线操作指导

Allegro如何画半圆形的线操作指导 在用Allegro设计PCB的时候,在某些应用场合会需要画半圆形,如下图 如何画半圆形,具体操作如下 点击Add点击Arc w/Radius...

【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】

一.知识回顾 之前的文章我们一起学习了MySQL面试必问系列之事务专题、锁专题&#xff0c;没有学习的小伙伴可以直接通过该链接地址直接访问&#xff0c;MYSQL你真的了解吗专栏的文章&#xff0c;接下来我们就一起来学习一下MySQL中SQL语句的执行流程&#xff0c;看看你掌握的怎…...

详解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℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上应用HRB 0.2~10W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36VDC标准&#…...

EF有几种模式,EF的三种模式分别是什么?

EF有几种模式&#xff0c;EF的三种模式分别是什么&#xff1f; 第一种&#xff1a;DataBase First DataBase First传统的表驱动方式创建EDM&#xff0c;然后通过EDM生成模型和数据层代码。除生成实体模型和自跟踪实现模型&#xff0c;还支持生成轻型DbContext。 解释&#xf…...

数据可视化展示:打工人常见职业病,颈腰椎病占比最高达66.51%

身体健康才是一切的根本。只有身体健健康康才能更好的去享受世间的美好&#xff0c;无论是谁都应当注重身体健康&#xff0c;而不是无度的挥霍它&#xff01; 良好的身体&#xff0c;释放给工作&#xff0c;健壮的体魄&#xff0c;享受美好生活&#xff0c;良好的心态&#xff…...

【食品图像识别】Large Scale Visual Food Recognition

1 引言 视觉智能部与中科院计算所于2020-2021年度展开了《细粒度菜品图像识别和检索》科研课题合作&#xff0c;本文系双方联合在IEEE T-PAMI2023发布论文《Large Scale Visual Food Recognition》 (Weiqing Min, Zhiling Wang, Yuxin Liu, Mengjiang Luo, Liping Kang, Xiaom…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...