写点什么

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

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

关注

评论

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

区块链行业发展的“忧与愁”

CECBC

区块链 互联网

week04作业

龙卷风

架构师一期

B站真题:如何判断括号是否有效?

王磊

Java 数据结构 算法

极客时间架构师培训 1 期 - 第 4 周作业

Kaven

架构师训练营第 1 期 - 第四周总结

Todd-Lee

极客大学架构师训练营

WEEK4 一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述

陈勇

DDIA读书笔记(1)可靠性,可扩展性,可维护性

莫黎

读书笔记

架构师训练营 1 期 -- 第四周作业

曾彪彪

极客大学架构师训练营

会用Docker的人都别装了,这多简单呐

MySQL从删库到跑路

MySQL Docker Linux yum redhat

LeetCode题解:22. 括号生成,递归生成同时过滤,JavaScript,详细注释

Lee Chen

大前端 LeetCode

架构师训练营第四周作业

吴传禹

极客大学架构师训练营

week04总结

龙卷风

架构师一期

聊聊「测试分工和测试时间」

清菡软件测试

测试

区块链助力政府建设高效政务能力

CECBC

区块链 政务

架构师训练营 1 期 -- 第四周总结

曾彪彪

极客大学架构师训练营

训练营第四周作业 2

仲夏

极客大学架构师训练营

互联网架构演化

张荣召

大型互联网应用面对的挑战及应对方案和手段

张荣召

视读——沟通的艺术,看入人里,看出人外(第四章)

废材姑娘

Spring 事务,你真的用对了吗(上篇)?

废材姑娘

Spring MVC

训练营第四周作业 1

仲夏

极客大学架构师训练营

为什么说 Python 内置函数并不是万能的?

Python猫

Python

系统架构:系统技术挑战与方案

张荣召

用Python绘制地理图

计算机与AI

Python 绘图

WEEK4 学习总结

陈勇

极客大学架构师训练营

Paxos 的变种(一):Multi-Paxos 是如何劝退大家去选择 Raft 的

多颗糖

分布式 架构师 分布式架构 分布式一致性

理解分布式一致性:Raft协议

程序那些事

分布式 raft 分布式一致性 raft协议

理解分布式一致性:Paxos协议之Basic Paxos

程序那些事

raft PAXOS raft协议 paxos协议 Basic paxos

架构师训练营第 1 期 - 第四周作业提交

Todd-Lee

极客大学架构师训练营

架构师训练营-week04-作业1

lucian

极客大学架构师训练营

架构师作业 - 第四周 - 一个典型的大型互联网应用系统使用了哪些技术方案和手段

袭望

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