写点什么

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

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

关注

评论

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

Android 修改系统屏幕亮度及监听

yechaoa

android 6月月更 Brightness

数据库每日一题---第19天:排名靠前的旅行者

知心宝贝

数据库 前端 后端 云 原生云 CTO 6月月更

SRE Lesson One -- Day2 熟练使用 Markdown

耳东@Erdong

SRE 6月月更 SRE Lesson One

阿里出品!图形化的ant脚本——IDEA插件CloudToolkit

Java全栈架构师

Java 阿里巴巴 程序员 IDEA 开发工具

JUnit VS TestNG

FunTester

从摄影“鄙视链”说起,聊一聊XDR的安卓化之路

脑极体

在线文本按行批量反转工具

入门小站

工具

【愚公系列】2022年06月 通用职责分配原则(九)-受保护变量原则

愚公搬代码

6月月更

vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9

zhoulujun

国际化 i18n vue-i18n

小程序与工业互联网能够相辅相成的原因

Geek_99967b

小程序 小程序开发

vue2升级vue3:class component的遗憾

zhoulujun

@Options @Component class component

有一说一,高并发系统设计其实一点都不难!

Java全栈架构师

Java 程序员 面试 高并发 架构设计

eureka的解析

卢卡多多

Eureka 6月月更

数据治理的重要性

奔向架构师

数据治理 数据资产 6月月更

vue2升级vue3: 全局变量挂载与类型声明

zhoulujun

vue2升级vue3: Event Bus 替代方案

zhoulujun

Vue3 vue2 event bus

微博关闭发布多个兼职诈骗信息违规账号:如何打击数据造假灰产

石头IT视角

SRE Lesson One -- 写给SRE新手的入门手册

耳东@Erdong

SRE SRE Lesson One

Java Core 「14」J.U.C 线程池-Future & FutureTask

Samson

学习笔记 Java core 6月月更

必读书籍

玄兴梦影

学习 书籍 推荐书籍

vue2升级vue3:webpack vue-loader 打包配置

zhoulujun

vite webpack vue-loader

vue2升级vue3:this.$createElement is not a function—动态组件升级

zhoulujun

uni-app进阶之样式框架/生产环境【day10】

恒山其若陋兮

6月月更

在线JSON转HTMLTable工具

入门小站

工具

flutter系列之:flutter中的IndexedStack

程序那些事

flutter 程序那些事 6月月更

vue2升级vue3:TypeScript下vuex-module-decorators/vuex-class to vuex4.x

zhoulujun

vuex3

【网关对比】Java亿级流量架构之网关设计思路

Java全栈架构师

Java 程序员 面试 微服务 架构师

爆肝!阿里大佬自曝10w字Java面试核心知识手册,基础到高级足足涵盖30个技术专题

Java全栈架构师

Java spring 架构 面试 JVM

linux几个没用但是有趣的命令

入门小站

Linux

盘点常见的漏洞利用方式

穿过生命散发芬芳

漏洞利用 6月月更

微服务测试效率治理

阿泽🧸

微服务 6月月更

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