【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

关注

评论

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

基于云原生的集群自愈系统 Flink Cluster Inspector

阿里云大数据AI技术

机器学习 flink 运维 云原生 12 月 PK 榜

保护客户代码和应用安全,CodeArts有7招

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜 华为CodeArts

从recat源码角度看setState流程

flyzz177

React

当云原生成为一种显学,对象存储和数据湖如何顺势而为

云布道师

对象存储 云存储

演讲实录|姚延栋:终止“试点炼狱”,智能汽车时代数字化转型与实践

YMatrix 超融合数据库

车联网 海量数据 超融合数据库 智能网联 YMatrix

前端常见内存泄漏及解决方法

达摩

Web 内存泄露

Flutter for Web 首次首屏优化——JS 分片优化

阿里巴巴终端技术

flutter 前端 Web 客户端

从react源码看hooks的原理

flyzz177

React

前端leetcde算法面试套路之双指针

js2030code

JavaScript LeetCode

预训练时代的自然语言处理 魔搭社区NLP模型全解析

阿里技术

自然语言处理 NLP 大模型

“零容忍”监管,金融机构如何应对数据泄露风险?

极盾科技

数据安全

广告倒排服务极致优化

百度Geek说

架构 数据结构 后端 12 月 PK 榜

看透react源码之感受react的进化

flyzz177

React

转转用户画像平台实践

转转技术团队

大数据 用户画像 用户画像分析

Go语言性能剖析利器--pprof实战

京东科技开发者

Go pprof 优化技巧 Go 语言 #go

Python中图像平滑方法的两种非线性滤波:中值滤波、双边滤波

华为云开发者联盟

Python 人工智能 华为云 12 月 PK 榜

2022 年度“用 TDengine,写 TDengine”征文!

爱倒腾的程序员

数据库 tdengine 时序数据库

从源码角度看React-Hydrate原理

flyzz177

React

前端leetcde算法面试套路之二叉树

js2030code

瓴羊Quick BI数据填报组件,实现智能化管理和高效挖掘利用

夏日星河

如何用 30s 讲清楚什么是跳表

飞天小牛肉

redis 面试 社招 校招 秋招

喜讯+1!袋鼠云数栈技术团队获“2022年度优秀开源技术团队”

袋鼠云数栈

开源

火山引擎DataTester:无需研发人力,即刻开启企业A/B实验

字节跳动数据平台

A/B测试

IoT 设备定位服务——设备管理类

阿里云AIoT

物联网 API 定位技术

鸿蒙开发实例 | 鸿蒙原子化服务卡片开发完美体验

TiAmo

华为 鸿蒙 12月月更

浅析静态应用安全测试

华为云开发者联盟

测试 开发 华为云 12 月 PK 榜

React-Hooks源码深度解读

flyzz177

React

轻量级的架构决策记录机制

京东科技开发者

团队管理 架构 软件架构 架构设计 架构决策

Kubernetes 跨集群流量调度实战

Flomesh

服务治理 Kubernetes 集群 流量管理

多线程永动任务设计与实现

小小怪下士

Java 多线程

超大规模大数据集群管理平台的架构优化及实践

移动云大数据

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