聊一聊我对Restful的理解

news2024/9/27 12:11:04

概念

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/31541.html

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

相关文章

数据结构之基数排序

基数排序 先把各个数以个位数不同分到不同的队列中 如果一个队列多个元素用链表连起来 第一趟分配 然后进行第一趟收集 应为我们想得到递减 所以我们从个位数高到低收集 然后第二趟分配 根据第一趟得到的结果 以十位数分配 这里注意! 因为第一趟按个位分的&am…

ImmunoChemistry艾美捷高级钙素AM细胞活力试剂盒方案

ImmunoChemistry艾美捷ICT的Advanced Calcein AM Cell Viability Kit将Calcein AM与7-AAD相结合,可轻松同时标记单个样本中的活细胞、膜受损细胞和死细胞。钙黄绿素AM用于检测绿色荧光的活细胞,而7-AAD用于检测红色荧光的坏死或晚期凋亡细胞。可以使用流…

超详细curl新增支持openssl(https协议)支持

1、问题环境: os:Linux kali 5.5.0-kali2-amd64 #1 SMP Debian 5.5.17-1kali1 (2020-04-21) x86_64 GNU/Linux 2、涉及组件: curl当前版本:curl 7.85.0 openssl当前版本:OpenSSL 3.0.7 1 Nov 2022 (Library: OpenS…

学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

遥感SCI期刊汇总

1. BOLETIM DE CIENCIAS GEODESICAS 《大地测量科学通报》http://ojs.c3sl.ufpr.br/ojs2/index.php/bcgSemiannual (注:2008年开始被SCI收录)ISSN: 1413-4853UNIV FEDERAL PARANA, CENTRO POLITECNICO, UFPR CENTRO POLITECNICO, CURSO POS…

如何使用云服务器以及宝塔面板快速搭建discuz论坛网站?

前面介绍了很多搭建个人网站,云网盘的方法,这篇文章将介绍使用discuz搭建一个论坛网站,采用的方式为轻量应用服务器搭配宝塔面板一键式部署discuz论坛网站,感兴趣的小伙伴可以跟着我一起搭建起来! 说明: 云…

无线传感器网络:数据链路层,MAC

文章目录FramingByte CountFlag Byte MethodByte StuffingMedium Access Control (MAC)Static Channel AllocationDynamic Channel AllocationIndependent TrafficSingle ChannelObservable CollisionsContinuous or Slotted TimeCarrier Sense or No Carrier SensePure ALOHAS…

react的useState源码分析

前言 简单说下为什么React选择函数式组件,主要是class组件比较冗余、生命周期函数写法不友好,骚写法多,functional组件更符合React编程思想等等等。更具体的可以拜读dan大神的blog。其中Function components capture the rendered values这句…

JWT有状态登陆与无状态登陆

单点登录与JWT JWT 全称: Json Web Token 。作用: JWT 的作用是 用户授权(Authorization) ,而不是用户的身份认证(Authentication) 。用户认证 指的是使用用户名、密码来验证当前用户的身份,即用户登录。用户授权 指用户登录成功后…

「从零单排canal 07」 parser模块源码解析

本文将对canal的binlog订阅模块parser进行分析。 parser模块(绿色部分)在整个系统中的角色如下图所示,用来订阅binlog事件,然后通过sink投递到store. parser模块应该来说是整个项目里面比较复杂的模块,代码非常多。 因此,本文根…

Nmap爆破MySQL弱口令漏洞:解决报错Accounts: No valid accounts found

nmap工具不仅仅能扫描,也可以暴力破解mysql,ftp,telnet等服务。 看到这里不要怀疑,在kali系统中查一下到底支持哪些暴力破解功能,命令如下 ls /usr/share/nmap/scripts |grep brute.nse 查询结果为 afp-brute.nse …

镜像底层原理详解和基于Docker file创建镜像

目录 一、镜像底层原理 1.联合文件系统(UnionFS) 2.镜像加载原理 3.为什么Docker里的centos的大小才200M? 二、Dockerfile 1.简介 2.Dockerfile操作常用命令 (1)FORM 镜像 (2)MAINTAINER 维护人信息 (3&…

Vue的devtools安装教程

devtools是一个便于开发者调试Vue代码的插件 先确保你已经安装了node.js 点击此处去github上拉取工具包 安装yarn(用npm在打包的时候会失败,使用yarn可以打包成功) ① cmd输入:npm install -g yarn 全局安装yarn包管理工具   …

Nature Plants|植物基因组测序20年回顾与展望:三代HiFi基因组时代

2021年11月29日,美国密歇根州立大学在《Nature Plants》期刊在线发表题为“Representation and participation across 20 years of plant genomesequencing”综述,系统阐述了在过去的20年间,对陆地植物基因组学组装质量、已测序物种的分类和地…

Java的几大常用类

一、Object类 超类、基类,所有类的直接或者间接父类,位于继承树的最顶层。 任何类,如果没有写 extends 显示继承某个类,都直接默认继承 Object 类,否则为间接继承。 Object 类中所定义的方法,是所有对象…

DeeplabV3实战:基于tensorflow搭建DeeplabV3实现语义分割任务

任务描述: 语义分割是一种典型的计算机视觉问题,其是将一些图像作为输入并将它们转换为具有突出显示的感兴趣区域的掩模,即图像中的每个像素根据其所属的感兴趣对象被分配类别。如下图中左图所示,其语义是人骑自行车,语义分割的结果如右图所示,粉红色代表人,绿色代表自行…

狂神的MySQL(1)

01、什么是数据库,为什么要学习数据库 javaEE:企业级java开发 Web 前端(页面:展示,数据!) 后台(连接点:连接数据库JDBC,连接前端(控制&#xf…

web前端-javascript-运算符(介绍说明,算术运算符、+、-、*、/、%,隐式类型转换、转换为String、转换为Number)

文章目录运算符1. 操作符说明1.1. 通过运算符可以对一个或多个值进行运算,并获取运算结果1.2. 它会将该值的类型以字符串的形式返回2. 算数运算符2.1. 当对非 Number 的值进行运算时,会将这些值转换为 Number 然后再运算2.2. 2.3 -2.4 \*2.5 /2.6 %3. 隐式类型转换3…

思科配置VLAN间单臂路由

思科配置VLAN间单臂路由 为什么要配置单臂路由 路由器上链接不同的VLAN的物理接口数量有限,随着VLAN增加端口很快就被耗尽,然而VLAN中继允许单个路由器物理接口接多个VLAN的流量,即有了单臂路由技术。 示例拓扑 本文以下图所示拓扑为例配…

mac误删除文件恢复,mac文件丢失如何找回

mac误删除文件恢复?相信不少朋友一开始遇到这个问题没太放在心上,还以为是自己误删除了,想着以后删除文件的时候尽量小心点,直到发现重要文件被删除后没有经过废纸篓,而被直接删除了,这才引起重视&#xff…