写点什么

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

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

关注

评论

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

【Python实战】Python中parsel两种获取数据方式

BROKEN

三周年连更

OpenGL入门三:变换原理简介

轻口味

opengl 三周年连更

信道的定义和分类

timerring

信息论

OpenGL入门二:绘制三角形

轻口味

opengl 图形图像 三周年连更

五款提高程序员生产效率的ChatGPT神器,你一定不要错过!

cwang

Code Review Git Commit ChatGPT GPT-4 Prompt

《人生第一次》有感

后台技术汇

三周年连更

一文读懂Stable Diffusion教程,搭载高性能PC集群,实现生成式AI应用

GPU算力

推荐一款基于Vue3的移动H5模板,加速你的移动应用开发

cwang

前端 vant Vue 3 Web H5

2023-04-30:用go语言重写ffmpeg的resampling_audio.c示例,它实现了音频重采样的功能。

福大大架构师每日一题

Go 音视频 ffmpeg 流媒体 福大大

Nautilus Chain 测试网第二阶段,推出忠诚度计划及广泛空投

股市老人

云服务管理技术

阿泽🧸

三周年连更 云服务管理

算法题每日一练:矩阵置零

知心宝贝

数据结构 算法 前端 后端 三周年连更

Mac M1 8G丐版尝试本地部署Stable Diffusion

IT蜗壳-Tango

三周年连更

云环境下的新型IT运维体系

穿过生命散发芬芳

运维体系 三周年连更

Intelligent Enterprise 和 企业数字化转型的关联关系

汪子熙

人工智能 数字化管理 三周年连更

模块1-学生管理系统架构设计

冲虚

Linux 文件与目录管理

鸿蒙之旅

Linux 三周年连更

通过ChatGPT快速学习英语

石云升

AI ChatGPT 三周年连更

挑战 30 天学完 Python:Day16 时间datetime

MegaQi

挑战30天学完Python 三周年连更

【愚公系列】用友系列之YonBuilder低代码平台概论和基本使用

愚公搬代码

《写好README很重要》

后台技术汇

三周年连更

再来一篇,Go+Vue前后端分离设计实践

闫同学

三周年连更

Mac 电脑解决无法使用uiautomator viewer的问题

IT蜗壳-Tango

三周年连更

微信业务架构图

冲虚

在 Python 中如何使用 format 函数?

海拥(haiyong.site)

三周年连更

平凡而不凡,那些用键盘改变世界的“新型劳动者”

开放原子开源基金会

开放原子全球开源峰会

Go 为什么不支持可重入锁?

乌龟哥哥

三周年连更

Nautilus Chain 测试网第二阶段,推出忠诚度计划及广泛空投

西柚子

文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题

福大大架构师每日一题

福大大 ChatGPT 文心一言

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