写点什么

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

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

关注

评论

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

ByteHouse MaterializedMySQL增强优化

字节跳动数据平台

数据库 云原生 Clickhouse 企业号 3 月 PK 榜

草图大师;SketchUp Pro 2022 mac中英双语

真大的脸盆

Mac 3D 建模软件 建模工具 3d建模

软件测试/测试开发丨app自动化之如何参数化用例

测试人

软件测试 自动化测试 测试开发

一点点进步的OceanBase数据库文档!

OceanBase 数据库

数据库 oceanbase

质量内建落地的四要素

老张

质量保障 质量内建 交付质量

过等保堡垒机选择云堡垒机可以吗?有推荐的吗?

行云管家

等保 等级保护 行云管家 过等保

SpringBoot整合RocketMQ,尝尝几大高级特性!

Java你猿哥

RocketMQ Spring Boot 后端 ssm Java工程师

马蹄链DAPP合约项目系统开发技术方案(成熟技术)

I8O28578624

LED灯珠对LED显示屏8大影响

Dylan

LED显示屏 led显示屏厂家 户内led显示屏

简述几种常用的排序算法

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 3 月 PK 榜

自动调优工具AOE,让你的模型在昇腾平台上高效运行

华为云开发者联盟

人工智能 华为云 昇腾 华为云开发者联盟 企业号 3 月 PK 榜

安装Red Giant Maxon App时提示错误11025:无法连接到Red Giant服务

理理

红巨人特效插件 Red Giant 后期制作

Icons8 for mac(logo图标素材大全)

理理

Icons8 logo图标 素材大全 Icons8 for mac

ADDS-DepthNet:基于域分离的全天图像自监督单目深度估计

飞桨PaddlePaddle

如何解决Mac苹果上运行VMware Fusion虚拟机提示“未找到文件”

理理

VM虚拟机 未找到文件 VMware Fusion虚拟机 苹果系统虚拟机

数禾科技 AI 模型服务 Serverless 容器化之旅

云布道师

阿里云

分析机构称AMD的PC市场空间正被蚕食,英特尔第12/13代酷睿处理器更具竞争力

科技之家

软件测试/测试开发丨APP自动化Android特殊控件Toast识别

测试人

软件测试 自动化测试 测试开发

火山引擎DataTester:构建增长闭环,3-5人即可搭建企业增长团队

字节跳动数据平台

AB testing实战 A/B测试 企业号 3 月 PK 榜

深度解析微服务高并发:适配SpringMVC框架适配模块及实现原理

Java你猿哥

Java spring ssm Spring MVC Java工程师

修复“现在无法将USB设备连接到虚拟机,稍后尝试连接此USB设备 ”的方法

理理

usb pd18虚拟机 PD虚拟机不能联网

模拟经营类游戏:城市天际线Cities Skylines 怎么设置无限金币?

理理

城市天际线 Mac城市建造类游戏 Cities: Skylines

多功能PDF编辑工具:Nitro PDF Pro激活版

真大的脸盆

Mac PDF Mac 软件 PDF编辑 pdf编辑工具

批量上传iOS应用程序截图的实用技巧

雪奈椰子

硬核!阿里P8自爆春招面试核心手册,Github上获赞65.7K

Java你猿哥

Java 面试 面经 八股文 春招‘

龙蜥开发者说:给芯片以系统、给系统以社区 | 第 17 期

OpenAnolis小助手

开源 操作系统 芯片 社区 龙蜥开发者说

内核不中断前提下,Gaussdb(DWS)内存报错排查方法

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

合约跟单项目系统开发(技术源码)丨合约量化系统开发技术(成熟案例)

I8O28578624

一文看懂数据产品经理

Taylor

产品 #数据产品经理 #数据产品 #职业发展 #产品思维

GPT-4写代码能力提升21%!MIT新方法让LLM学会反思,网友:和人类的思考方式一样

Openlab_cosmoplat

机器学习 开源社区 智能 ChatGPT GPT-4

中康科技黄毅宁:AI+医疗,于我而言是圆梦

飞桨PaddlePaddle

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