聊一聊我对Restful理解

news2024/9/28 1:23:14

概念

REST原则提倡按照HTTP的语义使用HTTP,如果一个系统符合REST原则,我们就说这个系统是Restful风格的。Restful是Web API设计中非常重要的一个概念,但是很多开发人员对于Restful的理解存在误区。

什么是Restful

在说什么是Restful 之前,我们首先要知道在Web API开发中有两种风格,一种是面向过程的(简称RPC)还有一种面向REST的(简称REST),在知道有这两风格后我们通对比的方式能更好的理解什么Restful。

在RPC风格的Web API中,我们通过“控制器/操作方法”的形式来调用服务器端的方法,把服务器端的代码当成方法去调用。这种风格的接口可能会用POST请求处理所有的操作方法,无论是获取、新增、更新还是删除数据,这样的接口只是把HTTP当成一个传输数据的通道,而不关心HTTP谓词的语义。在这样的接口中,我们通过QueryString(查询字符串)或者请求报文体来为服务器传递数据。只要服务器端能够正常完成客户端请求的处理,服务器就会统一返回200的HTTP状态码。对于逻辑上的错误,返回的HTTP状态码也是200,只不过在响应报文体中通过不同的错误码来表示,比如 {"code":1,"msg":"用户不存在"}。

与之对应,在REST风格的Web API中,接口把服务器端当成资源来处理。REST风格的接口按照HTTP设计之初的语义来使用HTTP,把系统中的所有内容都抽象为资源,所有对资源的操作都是无状态的且可以通过标准的HTTP谓词来进行。

举个例子可能更好理解这句话的含义,例如:我们有个根据用户id查看用户详细的接口,按照RPC 风格设计的话,大概是这样:api/User/GetUserById?id=1,Restulf风格:api/user/1,对比这两个路由很容易就能看出,Restulf风格把查询用户id为1的请求参数当作了路由的一部分,可以理解为资源。

Restful设计规范

(1)所有的资源都尽量通过URL来表示,避免通过QueryString、报文体来对资源进行定位,这样URL的语义性更清晰。
(2)对所有类型资源的新增、删除、修改、查询操作都统一为向资源发送POST、DELETE、PUT、GET请求,接口统一且具有自描述性,减少了开发人员对接口文档的依赖性。
(3)对于GET、PUT、DELETE等幂等的操作,网关、网络请求组件等可以对失败的请求自动重试。
(4)网关等可以对GET请求进行缓存,能够提升系统的访问速度,而且降低服务器的压力。
(5)通过HTTP状态码反映服务器端的处理结果,能够统一错误码,避免自定义错误码带来的不统一的问题。客户端也可以根据错误码进行统一处理,比如对于403状态码,客户端统一提示用户去登录。

如果严格按照上面的Restful设计范来设计我们API会存在如下问题:
(1)真实系统中的资源非常复杂,很难清晰地进行资源的划分,因此Restful风格对设计人员的IT技能和业务知识的水平要求都非常高。
(2)真实系统中的业务很复杂,并不是所有的操作都能简单地对应到PUT、GET、DELETE、POST上。而且对于同一个资源的同一个HTTP谓词有时候有多个业务逻辑,例如:api/user/DeleteById?id=1、api/user/DeleteByAccount?account=adm001 这两个都删除用户的的接口,一个是根据用户id,一个是根据用户账号(account)删除。
(3)在Restful中,资源尽量通过URL来定位,要尽量避免使用QueryString及请求报文体传递数据。例如:api/user/1、api/user/1/age/18,像这种地址并不符合中文的表达习惯,因此这样写会让很多开发人员迷惑。
(4)HTTP状态码的个数是有限的,特别是用于表示业务相关的错误码主要在4xx状态码段中,而业务系统中的错误非常复杂,仅通过HTTP状态码来反映错误有时候会无法满足要求。
(5)有一些宽带运营商、路由器、浏览器会对非200状态码的响应报文进行篡改。比如,把状态码为404的响应报文篡改为了广告内容。
(6)有的客户端是不支持PUT、DELETE请求的,比如旧版本的支付宝小程序、一些旧版浏览器等就不支持PUT、DELETE请求。

两种风格的对比图: 

 

结论

我们知道REST是比较学术化的概念,它只是一个参考的风格,并不一定需要严格遵守Restful风格。AWS、ElasticSearch等的接口比较接近于Restful风格,因为这些系统的业务资源比较固定、业务流程变化不大而很多互联网系统、业务系统比这些系统复杂很多,而且面临的使用场景也更加复杂,因此即使是腾讯、阿里巴巴等大公司的业务相关接口,很多也不是完全遵守Restful风格的。
REST概念是用来指导我们设计接口的,而不是给开发带来麻烦的,不能因为要遵守Restful风格而影响开发进度及系统的稳定。如果项目的资源及业务流程像AWS、ElasticSearch等比较清晰、固定,并且开发团队中有对REST理解非常深入的开发人员,那么我们可以严格遵守Restful风格。但是对于大部分系统,业务资源和业务流程都是非常复杂的,业务需求的变动也是比较频繁的,而且大部分项目的开发人员的技术是参差不齐的,如果严格遵守Restful规范,会使得新员工的培养周期变长。因此在进行项目开发的时候,需要根据项目特点、公司人员等多方面情况,确定一个符合项目情况的定制版Restful规范。

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

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

相关文章

MES必懂知识,市场需求下的生产管理系统

任何事物的产生和发展都与市场的需求是分不开的,只有当市场需求新生的事物的时候,他才会兴起,有的事物早已经产生,在当时的环境下并未兴起,却在后来才兴盛,这是市场的需求的影响。 MES便是在市场需求下诞生…

高通导航器软件开发包使用指南(9)

高通导航器软件开发包使用指南(9)8参数说明8.1最小条件参数8.2光学流量数据图8.3光学流量估算数据图8.4光学流量估算图8.5 pos_hold_mode内存8.6体积参数8.7障碍物输出参数8.8速度平滑曲线8参数说明 每辆车必须在适当的位置有运行时参数文件&#xff0c…

How to build several ftp servers on one mac OS

1 How to establish one ftp server locally? I have viewed one article which helps us how to do this on mac OS. You can refer to this link Mac下搭建FTP服务器 please read the tutorial seriously. What I do in the following will be based on it. 2 How to buil…

centos7操作系统开机提示error:file “/boot/grub/i386-pc/normal.mod“ not found

一.问题现象 公司重要业务虚拟机突然业务访问不了,重启操作系统之后发现操作系统启动不了,直接进入救援模式,提示error:file “/boot/grub/i386-pc/normal.mod“ not found,报错截图 二.处理思路 在救援模式下,只有很…

用HTML+CSS做一个简单好看的汽车网页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

网页开发——淘宝首页导航

这篇博文主要是重新学习&#xff08;复习&#xff09;前端知识&#xff0c;通过写淘宝购物首页导航为案例。 html主要书写内容&#xff1a; 1.首先我写了一个大盒子&#xff0c;用于存放所用的全部标签 <div class"nav">主要内容 </div> 2.插入一张淘宝…

AE/PR模板:镜头光晕炫光动画叠加特效 Premium Overlays Light Leaks

Premium Overlays Light Leaks是一款镜头光晕炫光动画叠加特效的AE/PR模板&#xff0c;非常适用于人物传记、演示文稿、出游vlog、产品展示等场合使用&#xff0c;为您的作品增添更出彩的视觉效果&#xff0c;喜欢的朋友不要错过哦~ 适用软件&#xff1a; AE 2019 或更高, PR 2…

YUV图像格式转换方法实践

一 I420转NV12 1.I420格式 &#xff08;1&#xff09;I420是每四个Y共用一组UV&#xff0c;如果一帧I420图像宽带是width&#xff0c;高度是height&#xff0c;1个像素占1个字节&#xff0c;那么共有width✖height个Y&#xff0c;U和V都是width✖height / 4个&#xff0c;因此…

JS 数据结构:队列

队列 定义&#xff1a; 队列(Queue) 是一种只在表的一端进行插入&#xff0c;而在另一端进行删除的数据结构。 队头(front) 允许删除的一端&#xff0c;永远指向第一个元素前一个位置。队尾(rear) 允许插入的一端&#xff0c;永远是指向队列最后一个元素先进先出(First In Fi…

一个漏测Bug能让你想到多少?

一、背景 漏测Bug是指产品逻辑缺陷在测试过程中没有被发现&#xff08;尤其是测试环境可以重现的缺陷&#xff09;&#xff0c;上线版本发布后或者在用户使用体验后发现并反馈回来的缺陷。可能造成线上故障或者资损&#xff0c;在对产品测试过程中&#xff0c;自己也难免出现一…

大二Web课程设计期末考试——基于HTML+CSS+JavaScript+jQuery电商类化妆品购物商城

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

[C++] std::ranges中的特征和自定义std::ranges::view变换

文章目录1. std::ranges中的特征1.1. std::ranges::range例子细化1.2. std::ranges::sized_range1.3. std::ranges::borrowed_range1.4. std::ranges::view2. std::ranges::subrange 迭代器-哨位对2.1. 构造2.2. 结构化解绑2.3. 操作3. std::views中的std::ranges::view变换3.1…

如何安装 Elasticsearch

实战场景 如何安装 Elasticsearch 知识点 •CentOS •Java •Elasticsearch 安装 •Kibana 安装 菜鸟实战 Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的…

编译器设计(十一)——标量优化

文章目录一、简介二、消除无用和不可达代码2.1 消除无用代码2.2 消除无用控制流2.3 消除不可达代码三、代码移动3.1 缓式代码移动3.2 代码提升四、特化4.1 尾调用优化4.2 叶调用优化4.3 参数提升五、冗余消除5.1 值相同与名字相同5.2 基于支配者的值编号算法六、为其他变换制造…

ubuntu 创建桌面快捷启动

前言&#xff1a; ubuntu系统通常不会在桌面上生成启动图标&#xff0c;一般需要自己建一个下面提供常用的两个模板&#xff0c; 1.启动其他程序 2.启动文件快捷方式 一、创建其他程序的启动快捷图标 用pycharm2022为例子 touch pycharm2022.desktop gedit pycharm2022.d…

为什么 JVM 叫做基于栈的 RISC 虚拟机?

为什么 JVM 叫做基于栈的 RISC 虚拟机&#xff1f; 其实这个问题比较简单&#xff0c;今天这篇文章的主要目的是想让大家看一下分析这个问题的逻辑&#xff0c;并且如何更好地从一手资料里寻找这些问题的答案。 上图是《深入理解 Java 虚拟机》一书中的截图。其实&#xff0c;…

吊打面试官,HashMap 这一篇就够了

一、HashMap的简单使用 HashMap集合的创建&#xff1a; Map<String,String> map new HashMap<String,String>(); 使用put存储数据&#xff1a; map.put("张三","喜欢打游戏"); map.put("李四","喜欢睡觉"); map.put(…

电网运行信息检索系统的设计与实现

摘要 电网运行方式管理直接决定了电网企业的经济效益和安全效益,随着我国经济和社会的高速发展&#xff0c;我国电网的覆盖面积、网络节点和电压等级也高速增长。但是,我国当前电网运行方式管理工作水平还相对落后&#xff0c;制约了电网的安全经济效益。本文较为详细的分析了电…

第三章《数组与循环》第2节:多维数组

3.1小节介绍的数组都是把数组元素从逻辑上排成一行,因此它们被称为“一维数组”。如果一个班级内有15个学生,这些学生按照身高又分成3排就坐,其排列形式如图3-2所示: 3-2学生身高排列图 如果程序员希望按照每个学生在班级内的位置来存储他们的身高数据该怎么办呢?一些读者…

基于Java+Spring+Vue+elementUI大学生求职招聘系统详细设计实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅&#x1f447;&#x1f…