写点什么

请不要再管它们叫 REST API 了

  • 2019-12-20
  • 本文字数:988 字

    阅读完需:约 3 分钟

请不要再管它们叫REST API了

2000 年初,Douglas Crockford 宣称 JavaScript 是世界上被误解得最深的一门编程语言。造成误解的主要原因是糟糕的命名方式、设计上的错误和不严格的标准,等等。所以说,导致这种误解是很自然的。


去年,我在推特上发了一条有关 REST 架构范式的推文。



大多数人认为基于 URL 和 HTTP 动词设计的 API 就是 REST API,但这样的想法实际上错得离谱。


这个误解存在了很长一段时间。与 JavaScript 不一样的是,REST 指南已经说得很清楚了,REST 这个名词强调了状态转换(State Transfer),但大多数所谓的 REST API 设计者却忽略了这一点。


如果你问一下身边的程序员他们设计的 API 是否支持 HATEOAS,他们十有八九会瞪大了眼睛看着你,然后说:你到底在说什么?


然而,REST 的名字本身就说明了一切。它并没有说要使用哪一种协议,也没有说使用哪一种方式来标识资源,它只说到表示性状态转移(REpresentational State Transfer)。Roy Fielding 博士说,状态转移管理是 REST API 的一个必要条件。


真正的 REST API 应该为客户端提供状态以及在状态之间进行切换的方式。它提供了资源的表示(不一定是 JSON 格式)和指向相关资源的链接(超链接),这些链接可以让应用程序从一个状态切换到另一个状态。如下例所示:


{  "id": 463219,  "firstName": "John",  "lastName": "Smith",  "company": "Acme Inc.",  "salary": 72500,  "links": [    {      "href": "https://api.myapp.com/employees/employee/463219",      "rel": "self"    },    {      "href": "https://api.myapp.com/companies/company/375",      "rel": "company"    },    {      "href": "https://api.myapp.com/payments/employee/463219",      "rel": "payments"    }    ]}
复制代码


这个例子提供了资源的描述和其他相关资源的信息。


需要特别提到的是,是否使用 HTTP 协议并不重要。REST 的关键之处在于让服务器端来负责客户端的状态转移。客户端的状态几乎是由服务器端来驱动的,所以,讨论 API 版本管理并没有多大意义。客户端只要知道 REST API 的入口点就可以了,剩下的根据服务器端的响应来做决定,但这一点却被大多数人忽略了。


只是简单地将 CRUD 操作映射到 HTTP 动词的 API 与应用程序状态转移丝毫扯不上关系,你可以把它们叫作 Web API 或 HTTP API,但请不要把它们叫作 REST API。

延展阅读

我们为什么从 REST 转向 gRPC

英文原文

Please, Don’t Call Them RESTful


2019-12-20 17:443624
用户头像
小智 让所有人认同的文字称不上表达

发布了 410 篇内容, 共 409.9 次阅读, 收获喜欢 1986 次。

关注

评论

发布
暂无评论
发现更多内容

秒懂!进制和位运算

Ayue、

位运算 二进制

模块一

吴科🍀

初探 Redis 客户端 Lettuce:真香!

vivo互联网技术

Java 数据库 redis redis cluster lettuce

模块8作业

梦寐凯旋

#架构实战营

通过运行期类型检查实现泛型算法

喵叔

7月日更

作业1

🐻🐻

架构师训练营第 1 期 作业一

Rust从0到1-智能指针-Rc<T>

rust 智能指针 引用计数 smart pointer Rc<T>

IPFS分布式存储矿机挖矿系统开发

获客I3O6O643Z97

挖矿 ipfs如何挖矿

七月上

卢卡多多

7月日更

就这样,我走过了程序员的前五年。一路风雨泥泞,前方阳光正好。

why技术

生活 励志 北漂 经验总结 日常感悟

在线字节转换工具

入门小站

工具

深入理解搜索引擎——详解query理解

药老算法

搜索引擎 nlp query纠错 语义分析 意图识别

SUN太阳币APP系统开发方案

第8模块作业

高亮

架构训练营

用三国杀讲分布式算法,舒适了吧?

悟空聊架构

分布式 PAXOS 7月日更 三国杀 拜占庭

【建议收藏】数据可视化——带你从0-1实现折线图的多种方式

阿飞

大前端 js 数据可视化 canvas 图表

PowerShell 括号和别名

耳东@Erdong

PowerShell 7月日更

每天学习10个实用Javascript代码片段(四)

devpoint

JavaScript node,js 7月日更

【Flutter 专题】89 图解基本 Overlay 悬浮新手引导

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

校友小程序图片安全审核方案与security.imgSecCheck不能校验超过1M图片的解决思路

CC同学

乐挖矿场软件系统开发案例

职场中的换位思考,看这篇就够了

石云升

职场经验 7月日更 换位思考

架构实战营 - 模块8 - 作业

笑春风

八千里路云和月 | 从零到大数据专家学习路径指南

王知无

Python OpenCV 之图像梯度,Sobel 算子、Scharr 算子和 laplacian 算子

梦想橡皮擦

7月日更

AI时代,智能硬件如何照亮求学之路

脑极体

Swarm挖矿APP系统开发

获客I3O6O643Z97

挖矿挖什么币好 ipfs和swarm哪个更有价值

计算机基础知识 -- 位,字节,字符

转山转水

Linux之目录结构

入门小站

Linux

Pandas高级教程之:GroupBy用法

程序那些事

Python 数据分析 pandas

Docker 超详细版(基础+进阶)

若尘

Docker 容器 镜像

请不要再管它们叫REST API了_架构_Andrea Chiarelli_InfoQ精选文章