写点什么

请不要再管它们叫 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:443507
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 399.1 次阅读, 收获喜欢 1985 次。

关注

评论

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

“程”风破浪的开发者|Web3.0

六月的雨在InfoQ

Web3.0 10月月更 “程”风破浪的开发者 Web1.0 Web2.0

Feign的两个调用处理器

急需上岸的小谢

10月月更

Vue组件入门(十一)$attrs

Augus

Vue 3 10月月更

MySQL索引底层为什么用B+树?看完这篇文章,轻松应对面试

一灯架构

Java 10月月更

长安链源码分析之网络模块 net-liquid(8)

【Java深入学习】一个关于“锁”的程序-中

Geek_65222d

10月月更

一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推

一灯架构

Java 10月月更

docker学习笔记(四)

Studying_swz

Docker 10月月更

长安链源码分析之网络模块 net-liquid(11)

Git 操作命令笔记

宇宙之一粟

git 10月月更

“程”风破浪的开发者|Web 1.0、Web 2.0 和 Web 3.0 之间的比较

海拥(haiyong.site)

Web3.0 “程”风破浪的开发者

“程”风破浪的开发者|Web3.0是什么?带你解析Web3.0

芯动大师

Web3.0 “程”风破浪的开发者 Web2.0

YARN基本架构

穿过生命散发芬芳

YARN 10月月更

过去几个月,他们把数字化融进了中国经济的毛细血管

脑极体

详解CAN总线:CAN总线故障界定与管理

不脱发的程序猿

汽车电子 CAN总线 CAN总线故障界定 CAN错误故障诊断

2022-10-20:以下go语言代码输出什么?A:7;B:7.0;C:0;D:编译错误。 package main import ( “fmt“ ) func main() { const

福大大架构师每日一题

golang 福大大 选择题

docker学习笔记(三)

Studying_swz

10月月更

群晖(Synology)NAS 安装 MongoDB

HoneyMoose

智能化运维场景分析

阿泽🧸

10月月更 智能化运维

Spring Batch 中的 chunk

HoneyMoose

长安链源码分析之网络模块 net-liquid(10)

java多线程总结

Studying_swz

Java 10月月更

RxJava的操作符

急需上岸的小谢

10月月更

“程”风破浪的开发者|国产数据库---达梦应用技巧及使用案例

芯动大师

数据库 学习方法 “程”风破浪的开发者

feign client客户端的自动装配

急需上岸的小谢

10月月更

Glibc-scratch_buffer的源码分析

桑榆

源码刨析 10月月更 C++

“程”风破浪的开发者|代码规范

over℡

学习方法 “程”风破浪的开发者

长安链源码分析之网络模块 net-liquid(9)

Excel 的基本概念以及 Excel 文件的创建

芯动大师

Python Excel 10月月更

【愚公系列】2022年10月 Go教学课程 034-接口和多态

愚公搬代码

10月月更

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