写点什么

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

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

关注

评论

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

秒云成功入选《2022爱分析 · 信创厂商全景报告》

MIAOYUN

信创 信创云 金融信创 信创产业

Webpack插件核心原理

Geek_02d948

webpack

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

前端leetcde算法面试套路之堆

js2030code

JavaScript LeetCode

与Web3支付赛道主要项目相比,Zebec生态潜力相当大

股市老人

Webpack中的高级特性

Geek_02d948

webpack

我服了!腾讯专家手敲《Redis源码日志笔记》,字字如金

钟奕礼

Java 程序员 java面试 java编程

web技术分享| 图片上传与图片裁剪结合 vue3

anyRTC开发者

Vue 前端 Web 图片上传 图片裁剪

Redis数据持久化机制(备份恢复)、缓存淘汰策略、主从同步原理、常见规范与优化详解

C++后台开发

数据库 redis 中间件 后端开发 C++开发

上帝视角一览大数据开发体系

JAVA旭阳

Java 大数据

阿里技术官珍藏JVM全优笔记,细节满分,吃透写精通没问题

钟奕礼

Java 程序员 java面试 java编程

面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)

钟奕礼

Java 程序员 java面试 java编程

架构训练营模块一作业

Dinfan

架构实战营

前端精准测试实践

京东科技开发者

前端 测试 精准测试 webhook 精准分析

迁移回归问题新突破,火山语音团队论文被人工智能顶级期刊IEEE TPAMI接收

科技热闻

Webpack完整打包流程分析

Geek_02d948

webpack

理解Nodejs中的进程间通信

coder2028

node.js

彻底搞懂JS原型与原型链

hellocoder2029

JavaScript

惊喜!Alibaba架构师手写《Java一无所知到精通》文档

钟奕礼

Java 程序员 java面试 java编程

阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节

钟奕礼

Java 程序员 java面试 java编程

Jvm上如何运行其他语言?JSR223规范最详细讲解

架构师之道

Java JVM

不知如何优选达人?火山引擎VeDI零售行业解决方案一键解决!

字节跳动数据平台

大数据 数据分析 营销 12 月 PK 榜

如何通过C#合并Word文档

在下毛毛雨

C# .net word文档 文件合并

手写vue-router核心原理

hellocoder2029

JavaScript

Java语言标识符的命名规范(超详细讲解)

千锋IT教育

前端leetcde算法面试套路之树

js2030code

JavaScript LeetCode

用 nodejs 搭建脚手架

coder2028

node.js

理解NodeJS多进程

coder2028

node.js

细说JavaScript闭包

hellocoder2029

JavaScript

模块一

GeekMLS

构架

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