RESTful API规范

前言

我现在工作的公司是在毕业前实习的公司, 实习结束后直接转正, 因此也是我任职过的唯一一家公司.

在日常工作进行 HTTP 接口的开发时, 发现了一个疑惑, 只用到了POSTGET请求, 但我们知道 HTTP还有PUT/DELETE等等, 为什么不用呢?

并且, 接口的响应码也只有200, 接口是否出错, 会在响应体中额外添加status字段来标识. 当然, 偶尔也会碰到404/500之类的响应码, 不过他们都还没有到业务层就返回了, 因此并不是我们主动涉及的响应码. 但是, HTTP 响应码辣么多, 为什么不用呢?

就在我苦苦思索仍不得其解的时候, 我去翻看了一下 HTTP 协议的RFC文档, 发现官方对不同的HTTP Method已经给出解释了. 并且我还发现了一个叫做RESTful API的接口设计规范.

介绍

HTTP

让我们先看看设计者是如何说明不同HTTP Method的, RFC 文档地址:

Method介绍幂等
GET数据的查询操作Yes
HEADGET相同, 区别是响应中不包含响应体.
可以用来获取资源的元数据, 如 header 等
Yes
POST信息的创建
有意思的是, 创建成功应该返回响应码 201
No
PATCH用于局部更新
从 POST 请求分出来的, POST 全量更新, PATCH 局部更新.
文档地址
No
PUT信息的更新Yes
DELETE数据删除Yes
OPTIONSAPI 相关信息
如探测服务支持的所有Method, 或者检测服务通不通.
Yes
CONNECTED与服务器建立链接, 通过服务器代理客户端请求
说白了就是一个 HTTP 代理
Yes
TRACE对请求路径的环回测试Yes

幂等, 上面表格中幂等的意思就是, 接口调2次和调1次结果一样, 既可以重复调用.

同时, RFC对响应码的定义, 也仅仅定义了一部分, 也就是说仍然有很大一部分响应码是可以根据我们的需求自行使用的. 响应码文档地址

响应码介绍
1xx请求已收到, 需要继续操作
2xx请求成功处理
3xx重定向, 需要进一步请求
4xx客户端错误
5xx服务器错误

我们已经了解了在定义HTTP协议的时候已经对Method及响应码做出了规定, 基于此, 我们可以前去了解这个叫做REST的玩意了.

顺便提一句, HTTP响应码非200, Response Body中也是可以传输错误信息的. RFC 文档说明

RESTful API规范

在维基百科 上对REST有着简要介绍. 原始论文地址

RESTful API就是符合REST规范的Web API.

简单来说, RESTful API对接口提出的规范如下

  • 通过URI进行资源的定位
  • 通过HTTP Method指定操作类型
  • 将响应码放到Response Code

举个简单的例子, 比如对一篇博客文章的增删改查操作, 按照之前的涉及, 应该出这样4个 POST 接口 insertArchive/deleteArchive/updateArchive/getArchive

但若是按照REST风格来, 就应该是这样4个接口

  • PUT /archive
  • DELETE /archive/<ID>
  • PATCH /archive/<ID>
  • GET /archive/<ID>

其中URI仅用作对资源的标识, 是没有动词的, 然后通过HTTP Method来指定要执行什么操作.

PS: 仔细看了HTTP RFC 文档后, 发现RESTful API就是HTTP设计者当初设计时想要的模样呀. (规范使用HTTP MethodResponse Code)

PS: 发现了一个开源项目OpenAPI, 指导API设计的, 有时间详细看看

优点

REST风格必定不是无根之木, 一定是为了解决某些问题而提出的.

REST风格和全部使用POST的区别在哪呢? 比较了一下, 主要是:

  • 将操作动词从URI挪到了HTTP Method
  • 将返回的响应码从body挪到了Response Code

其带来的直接效果, 就是当中间服务(比如 nginx)拿到一个请求与响应时, 因为数据格式的统一, 可以方便的知道此请求是做什么用的及是否成功.

如此一来, 中间层就可以据此做一些事情了:

  • 缓存GET请求进行缓存
  • 读写分离 将读写请求路由到不同服务器上
  • 性能分析 将各种操作进行整合
  • 权限控制 可以直接根据HTTP Method进行权限控制, 不用再一个个指定URI了.

当然, 据说改为REST风格后, API 的也会更加简介且清晰, 不过我导没什么直观的感受.

个人理解

以上, 看起来大佬提出的REST风格确实不错. 谷歌 API 设计指南也是遵循REST风格的. 此风格的接口也确实会带来一些好处.

那么在实际工作中如果将风格转换为REST是否可行呢? 我觉得可能会碰到如下阻碍(暂时想到):

  • 对于现实较为复杂的业务场景, 不同人可能会有不同理解. 比如批量删除, 同时更新用户信息与店铺信息等等.
    • 若两个人根据REST风格提出两个接口, 那就公说公有理婆说婆有理了
    • 如果是之前的POST风格, 接口名直接翻译业务场景就可以了
  • 开发思想的转变
    • REST要求面向资源, 而现实中往往是面向业务的
  • 现实问题
    • 看到有人说, 有些防火墙直接将PUT/DELETE请求屏蔽了(我没碰到过)
    • 还有人说在浏览器上也碰到过类似的问题?? 不过需要实际调研

以上, 仅仅是我目前想到的可能会出现的问题. 未来如果有机会施行REST风格接口的话, 可能会发现其他问题吧, 当然也可能发现REST风格确实很好.

各位看客有没有实际体验过的? 分享一下使用体验.

原文地址: https://hujingnb.com/archives/843

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

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

相关文章

Golang 接口原理

问题 小提示, 若想直接查看原理, 可从接口原理开始查看. 有这样一段GO代码: func main() {var obj interface{}fmt.Printf("obj nil. %b\n", obj nil)type st struct{}var s *stobj sfmt.Printf("s nil. %b\n", s nil)fmt.Printf("obj nil. …

Docker kill 1无效

前言 我们在平常强制停用一个进程的时候, 会选择什么命令? 一般在测试使, 不考虑程序突然中断带来的影响, 直接使用kill -9 pid强制停止就行. 但是, 就在刚刚, 我启动了一个docker容器, 进入容器后执行命令kill -9 1没有任何效果??? 啊这, 为什么呀? 尝试 为了解释这个…

容器内存相关知识

这篇文章是我研究容器内存整理出的相关内容. 前后内容并没有上下文关系, 每个知识点都可以单独查看. 内存控制 使用这样的命令启动一个容器docker run -d -m 300M xxx. 可以限制容器使用的内存最大为300M. 那么docker是如何实现容器的内存限制呢? 其实是操作系统已经做好了…

三星识别文字_比亚迪电子助力三星Galaxy Note 10系列霸气首发!

三星有子初长成气宇轩昂 秀美俊逸减之一分则嫌柔增之一分则嫌赘2019年8月7日于纽约巴克莱发布Galaxy Note 10系列用简约 重构美三星Galaxy Note 10与Galaxy Note 10分别搭载了6.3英寸和6.8英寸的超感官全视曲面屏&#xff0c;均采用单摄挖孔屏&#xff0c;开孔位于屏幕正上方。…

lisp 设计盘形齿轮铣刀_机械设计基础——周转轮系传动比的计算

点击上方蓝色字体&#xff0c;关注我们15(视频来源于网络&#xff0c;仅供学习交流&#xff0c;侵权请联系删除)机械计重点学习指导机械原理全书重点提要轴的结构改错机械设计作业集01机械设计作业集02机械设计作业集答案机械原理作业集机械原理作业集答案轴的强度计算院校推荐…

b+树阶怎么确定_B站公布年度弹幕,这个排名我不太服气

也忘记了是从什么时候开始&#xff0c;B站开始公布自己的年度弹幕了&#xff0c;今年的年度弹幕排名前五的分别是&#xff1a;爷青回、武汉加油、有内味了、双厨狂喜、禁止套娃。话说今年真的是不容易啊&#xff0c;过年那段时间以及上半年不会忘记那一幕幕感人深邃的瞬间&…

css打印适应纸张_从生态平衡到打印机故障分析

生态平衡(ecological equilibrium)是指在一定时间内生态系统中的生物和环境之间、生物各个种群之间&#xff0c;通过能量流动、物质循环和信息传递&#xff0c;使它们相互之间达到高度适应、协调和统一的状态。也就是说当生态系统处于平衡状态时&#xff0c;系统内各组成成分之…

html5调用系统声音1s响一次_20款奔驰GLC260提车改柏林之声音响,音乐诉请,为爱发声!...

奔驰GLC车型在2020上半年可谓是风生水起&#xff0c;尤其是2020年1-5月份的豪华品牌SUV排名中&#xff0c;奔驰GLC车型以58982的销售量遥遥领先&#xff0c;同比增长了2%&#xff0c;奔驰GLC5月销量高达15275辆&#xff0c;再次打败老对手奥迪Q5L&#xff0c;夺得豪华SUV销量冠…

js排序的时间复杂度_冒泡排序最好时间复杂度为什么是O

展开全部冒泡排序的基本思想是&#xff0c;对相邻的元素进行两两比较&#xff0c;顺序相反则进行交换&#xff0c;这样&#xff0c;每一趟会e68a8462616964757a686964616f31333433616161将最小或最大的元素“浮”到顶端&#xff0c;最终达到完全有序代码实现在冒泡排序的过程中…

kotlin将对象转换为map_将网站转换为Photoshop文档

WebToLayers是一款能够帮助大家将网页转换成图像格式的软件&#xff0c;能够Web页面转换成PNG&#xff0c;JPG以及PSD格式的图片。当网页转换为PSD的时候&#xff0c;网页的各个要素都会自动转换为相应的图层&#xff0c;使得大家能够对PSD格式的网页进行设计与管理。WebToLaye…

centos更换网卡后怎么更新配置_CentOS安装

服务器使用的Linux操作系统都使用了CentOS来进行安装&#xff0c;CentOS是一个开源的Linux发行版&#xff0c;具有很好的稳定性和更多的可扩展行。为了能够正常使用Docker&#xff0c;我们将使用CentOS7及以上版本。​下载地址&#xff1a;https://www.centos.org/download/ ​…

串口485接法图_rs485接口接线怎样操作?

展开全部RS485采用差分62616964757a686964616fe58685e5aeb931333365633939信号负逻辑&#xff0c;2V&#xff5e;6V表示“0”&#xff0c;- 6V&#xff5e;- 2V表示“1”。RS485有两线制和四线制两种接线&#xff0c;四线制是全双工通讯方式&#xff0c;两线制是半双工通讯方式…

centos普通用户修改文件权限_Linux实战014:Centos创建用户并添加root授权

刚收到在腾讯云申请的云服务器8台&#xff0c;现在准备分配给不同项目组来使用。为了确保系统及账号的安全&#xff0c;root账号不能直接给到他们。因为root的权限太大&#xff0c;任何的误操作就可能导致系统异常或者数据丢失找不回来。而且我们这是生产环境&#xff0c;账号会…

mongodb 导出txt_(干货)前端实现导出excel的功能

前言 导出功能其实在开发过程中是很常见的,平时我们做导出功能的时候基本都是后台生成&#xff0c;我们直接只需要调一支接口后台把生成的文件放到服务器或者数据库mongodb中,如果是放到mongodb中的话,我们需要从mongodb中通过唯一生成的id去拿到文件,最后window.location.href…

1971旗舰cpu intel_CPU的历史

很多人都对电脑硬件有一点的了解&#xff0c;本人也算略懂一二&#xff0c;所以今天来为大家说说电脑的主要硬件之一––CPU(中央处理器)。那么我们知道世界上造CPU的公司主要就是Intel和AMD。其实仔细想想&#xff0c;CPU的主要成分是什么?是硅(Si)&#xff0c;硅从那里来&am…

文本显示变量_【RPA课堂】UiPath中的变量、数据类型和组件

自动化出现的那一天起&#xff0c;就有了各种各样的工具来满足自动化的需要。无论是用于windows桌面自动化的简单工具&#xff0c;还是用于企业自动化大量任务的工具&#xff0c;它们都有自己的功能。UiPath就是这样的工具&#xff0c;在本文中&#xff0c;我们介绍一些非常基本…

linux挂载cifs磁盘_CentOS7.4_1708挂载CIFS报错

CentOS7.41708操作系统&#xff0c;Windows_Server2012做1TB的网络共享磁盘(没有域)。今天在项目做软件加密的部署&#xff0c;现场环境是Vsphere虚拟化需要用CIFS共享来传输文件、软件等。CRT、Putty等工具的传输工具无法传输字符集&#xff01;CentOS操作系统终端界面无任务信…

bootstrap上传图片可实现查看上一张图片和下一张图片_如何实现像人民日报微信推文一样的的点亮效果?...

如何实现向人民日报微信推文一样的的点亮效果&#xff1f;有两种方法&#xff1a;方法一&#xff1a;就是使用代码在编辑器进行编辑emmmmmm这个方法贼麻烦&#xff0c;需要调至HTML模式……方法二&#xff1a;在现有编辑器模板下利用SVG动画进行编辑&#xff0c;因为点亮效果本…

python加载项向导_Python安装与环境变量的配置,Python安装向导

我下载的是Python2.7.17Python安装包下载地址&#xff1a;https://www.python.org/downloads/release/python-2717/根据实际的操作系统&#xff0c;安装合适的安装版本Python安装&#xff1a;1.双击下载包&#xff0c;进入Python安装向导。2.选择安装目录。博主安装目录为 D:…

python 单例模式 redis_python 单例模式实现多线程共享连接池

我们经常使用数据库连接池&#xff0c;但那是有时候有些库并没有实现线程安全的连接池&#xff0c;这个时候&#xff0c;该如何自己封装&#xff1f;多进程和多线程甚至协程模式下&#xff0c;如何控制数据库连接数量或者是socket连接数。这个问题很有意义。