写点什么

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

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

关注

评论

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

为什么大公司一定要使用微服务?神操作!

JVM调优资料

Java 程序员 后端

Redis挂了,流量把数据库也打挂了,怎么办?

why技术

Java 面试

【Vue2.x 源码学习】第二十三篇 - 依赖收集 - 视图更新部分

Brave

源码 vue2 8月日更

五面阿里拿下飞猪事业部offer,帮你突破瓶颈

JVM调优资料

Java 程序员 后端

MediaMuxer实用封装

Changing Lin

8月日更

硬核万字长文,深入理解 Java 字节码指令(建议收藏)

沉默王二

Java

极光开发者周刊【No.0730】

极光JIGUANG

肝到头秃!阿里爆款的顶配版Spring Security笔记

Java spring 程序员 架构 计算机

中高级Java面试中你不得不会的知识点,附详细答案

JVM调优资料

Java 程序员 后端

Apache ShardingSphere 元数据加载剖析

SphereEx

数据库 开源

【共识专栏】共识的分类(下)

趣链科技

区块链 共识机制 共识算法 共识分类

京东面试真题解析,帮你解决95%以上的问题!

JVM调优资料

Java 程序员 后端

CIS Kubernetes 基线测试

greatersecurity

Ubuntu 与 Mac 共享文件

TroyLiu

ubuntu 效率 Mac 文件传输 共享文件

MySQL不能没有字符串函数,就像西方不能失去耶路撒冷

北游学Java

Java MySQL 数据库

MySQL触发器介绍

Simon

MySQL

Hudi自带工具DeltaStreamer的实时入湖最佳实践

华为云开发者联盟

大数据 Hudi

是谁,在暗中观察

skow

Java 后端 Java设计模式 8月日更

图片风格迁移:基于实例缓解细节丢失、人脸风格化失败问题

华为云开发者联盟

神经网络 风格 实例 风格迁移 图像翻译

五分钟搞懂MySQL主从复制原理,附带学习经验

JVM调优资料

Java 程序员 后端

五年Java开发者小米、阿里面经,附相关架构及资料

JVM调优资料

Java 程序员 后端

如何使用 DDD 指导微服务拆分?

架构精进之路

微服务 DDD 8月日更

【Jackson技术专题】全方位系统化学习和使用指南

洛神灬殇

Jackson JSON库 JSON序列化 8月日更

synchronized 加锁 this 和 class 的区别!

王磊

Java 并发 8月日更

中高级Java大厂高频面试题,已开源下载

JVM调优资料

Java 程序员 后端

为什么@Value可以获取配置中心的值?年薪超过80万!

JVM调优资料

Java 程序员 后端

Java线程安全-JVM角度解析

程序员阿杜

Java JVM 多线程 并发 8月日更

中国首位 K8s ingress-nginx reviewer 同时提名成为 Apache APISIX committer

API7.ai 技术团队

开源 Kubernetes 采访 APISIX

三面拼多多,一篇文章帮你解答

JVM调优资料

Java 程序员 后端

为什么spring能最好地改变Java?成功跳槽阿里!

JVM调优资料

Java 程序员 后端

SpringBoot使用Junit5

Rubble

springboot JUnit 8月日更

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