10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

请不要再管它们叫 REST API 了

2019 年 12 月 20 日

请不要再管它们叫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:442912
用户头像
小智 前 InfoQ 主编

发布了 404 篇内容, 共 330.3 次阅读, 收获喜欢 1808 次。

关注

评论

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

【经验分享】如何释放企业CMDB价值?——CMDB建设路径浅谈

嘉为蓝鲸

运维自动化 配置中心 CMDB 配置信息 配置管理

《精通比特币》学习笔记(第一章)

棉花糖

区块链 读书笔记

用 Nginx 的 auth_request 模块集成 LDAP 认证

冯骐

Python nginx 运维 ldap 认证

Nginx安装后要做的第一件事

运维研习社

nginx WEB安全

阿里P7亲自讲解!驱动核心源码详解和Binder超系统学习资源,跳槽薪资翻倍

欢喜学安卓

android 程序员 面试 移动开发

手把手教学,如何使用低代码快速构建应用程序步骤详解!

优秀

低代码

神经网络攻防: 02.攻击模型的输出层

P小二

AIPwn AI安全 P小二 神经网络攻防

交换机配置的自动备份与变更告警

冯骐

Python 运维 网络 备份 multissh

思科设备漏洞 CVE-2018-0171 的快速修复

冯骐

Python 运维 安全 网络 交换机

Pgbouncer最佳实践:系列四

PostgreSQLChina

数据库 postgresql 软件 开源社区

炸裂!这份阿里P8大佬手写“Java核心技能精选”惨遭疯抢

Crud的程序员

Java 架构

2021总结全网最新、最全、最实用Java岗面试真题!已收录GitHub

比伯

Java 编程 架构 面试 程序人生

用 Go 写一个轻量级的 ldap 测试工具

冯骐

Go 运维 开发 ldap

GitHub上获赞10万star的高并发神级进阶资料,面试官再问高并发问题请你把这篇文章发给他!

Java架构之路

Java 程序员 架构 面试 编程语言

LeetCode题解:190. 颠倒二进制位,移动n,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

用 Go 写一个轻量级的 ssh 批量操作工具

冯骐

Go 运维 SSH

Serverless 极致弹性解构在线游戏行业痛点

阿里巴巴云原生

Serverless 微服务 开发者 云原生 消息中间件

软件开发,如何快速有效缩短项目周期

雯雯写代码

软件开发

都 2021 年了,也该抛弃 ExpressJS 了

LeanCloud

前端 nodejs 框架

史上最全整合第三方登录的开源库

happlyfox

OAuth 2.0 28天写作 3月日更

Golang 中的并发限制与超时控制

冯骐

Go 并发 超时

Github疯传!阿里内部Java高级工程师面试突击笔记全网首发,这也太香了吧

程序员小毕

Java 面试 分布式 微服务 高并发

在主动要求涨工资这事上,不要学我!从第一份工资800开始说起

四猿外

程序员 涨薪 工资 收入 跳槽

神经网络攻防:03.使用API修改神经网络参数

P小二

AIPwn AI安全 P小二 神经网络攻防

云安全和访问管理

龙归科技

云计算 安全 云端 企业安全

Open-Falcon 中的 LDAP 认证

冯骐

Python Go 运维 Open-Falcon ldap

拍乐云加盟UCloud优云精选计划,构建云上的美好互动

拍乐云Pano

ucloud 云服务 RTC 拍乐云 白板

面试官:如何用SpringCloud从零设计一个大型电商平台?

Java架构追梦

Java 架构 面试 微服务 SpringCloud

迄今为止最好用的Flink SQL教程:Flink SQL Cookbook on Zeppelin

Apache Flink

flink

阿里P7亲自讲解!如何快速的开发一个完整的直播app,成功入职腾讯

欢喜学安卓

android 程序员 面试 移动开发

区块链产业革命:解决融资租赁之谜

旺链科技

区块链应用 融资租赁

开源中间件技术学习路线

开源中间件技术学习路线

请不要再管它们叫REST API了-InfoQ