NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

Vscode有什么好用的插件?

Jackpop

从-1开始实现一个中间件

艾小仙

Java 中间件 springboot

vue2升级vue3:class component的遗憾

zhoulujun

@Options @Component class component

Redis 做缓存场景引发的问题

Ayue、

redis

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

脑极体

技术实践 | 场景导向的音视频通话体验优化

融云 RongCloud

小程序怎样关联微信小程序二维码,实现二码合一聚合

Geek_99967b

小程序 小程序容器

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

zhoulujun

vue2升级vue3: Event Bus 替代方案

zhoulujun

Vue3 vue2 event bus

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

zhoulujun

拥抱开放,Serverless 时代的下一征程

阿里巴巴云原生

阿里云 Serverless 云原生 SAE

vue-axios(一)

小恺

6月月更

vue2升级vue3:Vue3时jsx组件绑定自定义的事件、v-model、sync修

zhoulujun

Vue3 sync tsx

必读书籍

玄兴梦影

学习 书籍 推荐书籍

阿里云 ACK One、ACK 云原生 AI 套件新发布,解决算力时代下场景化需求

阿里巴巴云原生

阿里云 云原生 分布式云容器平台 ACK One ACK 云原生 AI 套件

Redis HyperLogLog 是什么?这些场景使用让我枪出如龙一笑破苍穹

码哥字节

redis HyperLogLog Redis 数据结构

flutter系列之:flutter中的IndexedStack

程序那些事

flutter 程序那些事 6月月更

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

Java全栈架构师

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

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

恒山其若陋兮

6月月更

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

zhoulujun

vite webpack vue-loader

有哪些新手程序员不知道的小技巧?

Jackpop

C语言数组与指针练习题(原题+解析+原码)

未见花闻

6月月更

文件I/O

fy

UNIX系统

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

Java全栈架构师

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

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

Geek_99967b

小程序 小程序开发

基于 K8s 的交付难题退退退!| 独家交付秘籍(第三回)

阿里巴巴云原生

阿里云 Kubernetes 云原生 应用交付平台

一行代码可以做什么?

Jackpop

AWS CloudWatch

冯亮

云计算 监控 AWS

vue2升级vue3:Vue2/3插槽——vue3的jsx组件插槽slot怎么处理

zhoulujun

typescript Vue3 slots tsx slot

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

zhoulujun

国际化 i18n vue-i18n

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

zhoulujun

vuex3

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