Springboot怎么实现restfult风格Api接口

news2024/12/23 7:35:33

前言

在最近的一次技术评审会议上,听到有同事发言说:“我们的项目采用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对开发效率有明显的提升吗?我觉得未必,只不过接口定义看起来更简洁了,无形中开发效率会有一点点的提升,要说明显肯定是没有。

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

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

相关文章

Django实践-03模型-01表生成模型

文章目录Django实践-03模型Django MTV之模型投票案例1.创建应用1.创建应用2.配置模板文件2.配置关系型数据库MySQL1.创建数据库2.创建表3.按照MySQL依赖4.修改settings.py文件 添加应用 配置数据库5. 基于数据库生成实体类3.使用ORM完成模型的CRUD操作1.新增2.删除3.更新4.查询…

代数小课堂:向量代数(方向比努力更重要)

文章目录 引言I 数字的方向性1.1 箱子受力1.2 爆破逃离方向II 向量的表示法2.1 极坐标方法对向量表示2.2 终点的坐标表示向量III 向量的计算3.1 计算向量的长度和方向3.2 平行四边形法则(计算向量的长度)引言 代数学除了带来了方程和函数工具,还揭示了关于数字的另一个规律,…

C++——特殊类设计

目录 不能被拷贝的类 只能在堆上创建对象的类 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 饿汉模式 懒汉模式 单例对象释放问题 不能被拷贝的类 C98&#xff1a;将拷贝构造函数与赋值运算符重载只声明不定义&#xff0c;并且将其访问权…

React Native学习笔记(2.基本语法-类组件)

1. 基本语法 (1). 引入组件。(2). 继承共通。(3). 定义render函数。(4). 返回文本。(5). export导出 2. 自定义组件&#xff08;引用&#xff09; 将上面定义的"cat“组件引用到当前文件里 (1). inprot引入。(2). 使用 3. 自定义组件&#xff08;参数定义与传参&#x…

【Linux】项目自动化构建工具——make/Makefile

目录 1.make与Makefile的关系 Makefile make 项目清理 clean .PHONY 当我们编写一个较大的软件项目时&#xff0c;通常需要将多个源文件编译成可执行程序或库文件。为了简化这个过程&#xff0c;我们可以使用 make 工具和 Makefile 文件。Makefile 文件可以帮助我们自动…

你知道Java中的JCP, JEP, JLS, JSR是什么意思吗?

目录 一、JCP 二、JSR 三、JLS 四、JEP 公众号&#xff1a;MCNU云原生&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;及时掌握。 JCP, JEP, JLS, JSR这些概念是Java社区中的一些概念&#xff0c;但是没有没有经常关注社区的童鞋们未必知道这些缩写所代表的…

centos7搭建FTP

1.简介文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一种协议&#xff0c;工作于OSI&#xff0c;TCP的应用层&#xff0c;客户端和服务端之前连接要经过一次TCP的三次握手&#xff0c;其作用就是可以使用户以文件操…

第十二章 实现shallowReadonly功能

实现shallowReadonly功能 shallowReadonly&#xff1a; 让一个响应式数据变为只读的(浅只读) 接下来附上测试用例&#xff1a; import { isReadonly,shallowReadonly } from "../reactive"describe(shallowReadonly,()>{test(should not make non-reactive pro…

Session会话管理

会话管理Web会话管理概述常见的Web应用会话管理方式基于Server端的Session的管理方式基于Cookie的Session的管理方式Cookie与Session最大的区别Cookie-Based的管理方式基于Token-Based的管理方式Web会话管理的安全问题Web会话管理概述 会话管理&#xff1a;在进行人机交互的时…

java高级篇之三大性质总结:原子性、可见性以及有序性

1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点&#xff0c;那就是两大核心&#xff1a;JMM抽象内存模型以及happens-before规则&#xff08;在这篇文章中已经经过了&#xff09;&#xff0c;三条性质&#xff1a;原子性&#xff0c;有序性和可见性。关于sy…

JavaSE:常用类

前言从现在开始进入高级部分的学习&#xff0c;鼓励自己一下&#xff01;画个大饼&#xff1a; 常用类->集合框架->IO流->多线程->网络编程 ->注解与反射->GUI很重要的东西&#xff0c;不能不会&#xff01;Object类祖宗类&#xff0c;主要方法&#xff1a;t…

接口测试简介

接口测试简介 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 ——百度百科&#xff01; …

低代码开发与传统开发有什么不同?有什么价值?

低代码开发与传统开发有些什么不同&#xff1f;有什么价值&#xff1f; 自2014年Forrester明确提出低代码&#xff08;Low-Code&#xff09;概念以来&#xff0c;这一领域已经逐步升温。近年来&#xff0c;低代码凭借其低开发门槛和易用性等优点赢得了众多投资研究机构和企业用…

设计模式(十四)----结构型模式之组合模式

1 概述 对于这个图片肯定会非常熟悉&#xff0c;上图我们可以看做是一个文件系统&#xff0c;对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树&#xff0c;当我们找到某个叶子节点后&#xff0c;就可以对叶子节点进行相关的操作。可以将这颗树…

Cookie原理及JAVA端关于Cookie的增删改查操作

什么是Cookie 在java中&#xff0c;Cookie是来自于Servlet规范中一个工具类&#xff0c;存在于Tomcat提供servlet-api.jar中Cookie存放当前用户的私人数据 Cookie原理 用户打开浏览器第一次&#xff08;指每次重新打开浏览器的第一次&#xff0c;而非指历来第一次&#xff0…

ChatGPT可以作为一个翻译器吗?

论文地址&#xff1a;https://arxiv.org/abs/2301.08745.pdf 背景 自从OpenAI2022年11月30日发布ChatGPT以来&#xff0c;基本上把NLP所有任务大统一了&#xff0c;那么在机器翻译的表现到底如何呢&#xff1f;腾讯AI Lab在翻译Prompt、多语言翻译以及翻译鲁棒性三方面做了一…

365天深度学习训练营-第J4周:ResNet与DenseNet结合探索

目录 一、前言 二、论文解读 三、DPN代码复现 四、总结 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制● 难度&#xff1a;夯实基础⭐⭐ ● 语言&#xff1a;Python3、Pytorc…

难道ERP"死了",中台"凉了",低/无代码要称王了?

一句&#xff1a;“不上ERP等死&#xff0c;上了ERP找死”&#xff0c;可把ERP的尴尬处境说透了。 有人把ERP奉为信仰&#xff1a;“那些说ERP不好用的根本是没用明白。” 有人则认为ERP只是卖概念&#xff0c;冷嘲&#xff1a;“实施ERP的企业&#xff0c;估计一半都倒闭了。…

JavaSE-集合框架013-队列Queue及双端队列Deque

原文链接 Queue 我们可以把LinkedList当作队列来用&#xff0c;也可以当作链表来用。LinkedList只是一个实现方式&#xff0c;但是可以具备很多特点 虽然他是一个链表&#xff0c;但是当你从后加从前取&#xff0c;就是队列&#xff08;Queue&#xff09;。当你从后加从后取&a…

第七章 实现effect的stop功能

实现effect的stop功能 通过stop函数传入effect返回的runner 再次修改响应式对象的值的时候 不会修改成功 其实主要思路就是在调用stop函数的时候将 收集的effect依赖移除掉 老样子先给上测试用例&#xff1a; it(stop,()>{// 通过stop函数传入effect返回的runner 再次修…