REST API 已经 25 岁了:它是如何形成的,将来可能会怎样?
原文:https://journal.hexmos.com/rest-turns-25/
原题:REST APIs Turn 25: How They Came To Be and What Could Be Next
作者:Shrijith Venkatramana
翻译:豌豆花下猫&ChatGPT
根本问题:新兴的“AI 时代”将如何影响“Web 时代”的产物?
2000 年,Roy Fielding 在博士论文中,正式引入了“表述性状态转移” (Representational State Transfer,简称 REST)这一概念。随着 2024 年接近尾声,REST 的概念也即将迎来至少 25 岁了。我稍后会详细介绍,REST 的这 25 年是如何成为了“Web 时代”的特征。
随着“ChatGPT 演示”现象的出现,以及 AI 和自动化所带来的新乐观情绪,我希望重新审视 API,特别是 RESTful API 的历史。在文章的最后,我会对未来“AI 时代”中的 API 领域做一些大胆的猜测。
我对历史感兴趣,因为它为我们指明未来的方向
提醒读者:Fielding 的论文在“REST API”普及全球之前就已经完成了。Fielding 仅将“REST”作为在 HTTP 上构建“分布式超媒体”的架构风格之一(更像是 HTTP 的扩展)。因此,他对这一主题的表述相当抽象和微妙。
在本文中,我不打算详尽复述 Fielding 的观点,而是重点回顾在引入 REST 之前和之后的 API 发展历程,通过对比来更清晰地了解 API 的发展。我会更关注 API 的实际应用演变,而非其背后的学术理论。
为什么要研究历史?因为这有助于更清楚地了解 API 及其未来可能的演变方向。本文更多是一种个人对该主题的探索,而非严谨的学术研究。
REST 的核心:描述“Web 时代”的需求
在 Fielding 开始创作他的论文时:
- Web 已经出现了约 10 年。
- 它积累了一套标准和“运作方式”。
- Fielding 试图通过深入研究扩展、缓存、组件分区、通信和 Web 演变需求,避免有害的架构。
- 重点在于收集一系列“架构约束”以构建“架构风格”。
- Fielding 的研究成果直接应用于 HTTP 和 URL 标准的改进。
- 作为一种架构模式,REST 考虑了多个属性,包括组件交互的扩展性、通用接口、组件的独立部署、延迟、安全性和向后兼容性等。
API 历史的快速概览
1951 - 最早的 API,但未明确称呼(Maurice Wilkes)
1951 年,Maurice Wilkes 在《电子数字计算机程序》中引入了最早的类似于 API 的概念,提出可重用的软件例程来简化 EDSAC 计算机的编程。
1968 - 首次提到“API”一词(Ira W. Cotton)
1968 年,Ira W. Cotton 的论文《远程计算机图形学的数据结构与技术》首次使用“API”一词,指的是用于远程图形处理的接口。
1974 - 首个数据库 API(C. J. Date)
1974 年,C. J. Date 对比了关系数据库和网络数据库两种模型,重点讨论了它们的程序编程接口 (API) 的差异,以促进数据库交互。
1991 - CORBA 标准(Object Management Group)
1991 年,对象管理组 (OMG) 引入了 CORBA (公共对象请求代理架构) 标准,旨在实现不同系统和平台之间分布式异构应用的通信。
1993 - CGI(Roy McCool)
1993 年,Roy McCool 开发了通用网关接口 (CGI),这是 Web 服务器与外部应用交互的早期标准,为现代 Web API 奠定了基础。
2000 - Roy Fielding 提出 REST 理念
2000 年,Roy Fielding 的博士论文引入了 REST (表述性状态转移) 概念,为基于 Web 的应用定义了一种可扩展的无状态架构。
2002 - Bezos 的 API 指令:推动微服务
2002 年,Jeff Bezos 在 Amazon 内部发布了一项指令,要求所有团队通过服务接口 (API) 公开数据和功能,这为 Amazon 采用微服务架构和现代云计算奠定了基础。
2010 - Flickr 的照片 API
2010 年,Flickr 的照片 API 允许开发者以编程方式访问和操作用户上传的照片,实现了照片搜索、上传、打标签和元数据检索等功能。
2015 - GraphQL(Meta Platforms)
2015 年,Meta Platforms (原 Facebook) 推出了 GraphQL,一种灵活的 API 查询语言和运行时,允许客户端只请求所需的数据,从而优化数据检索并提高效率。
2016 - gRPC(Google)
2016 年,Google 推出了 gRPC,这是一种高性能、开源的远程过程调用 (RPC) 框架,支持分布式系统之间的高效通信,利用 HTTP/2 和 Protocol Buffers 进行数据序列化。
对未来的推测
随着 AI 的崛起:标准需同时适应人类与 AI
“Web 时代”的标准主要关注服务于人类用户。可扩展性、缓存、安全性、易理解性和简单性,都是我们人类关心的事物。这些对我们来说都是很重要的东西。
而现在,生产者和消费者中增加了新的“成员”——AI。在许多组织中,将有机器人团队执行各种工作。未来的生态系统必须调整了,以便同时提高 AI 和人类的生产力。
API 需更易于被 AI 智能体发现和使用:HATEOAS 可能重回视野
Fielding 的论文提出了 HATEOAS (应用状态的超媒体引擎) 概念,他想强调 API 的可发现性很重要。例如,在 API 的响应中,应该包含对消费者可用的其它资源的链接或引用。
这个想法没有广泛普及,但在 AI 智能体的参与下,这一概念可能会变得更为重要,因为许多 AI 可能会使用这些 API。这也意味着可以针对特定 AI 的需求生成“动态响应”。
编写优秀的 API 文档将更简单、成本更低
在未来,我相信设计、测试和共享 API 的难题可以通过先进的 AI 工具轻松解决。
- 撰写文档是一项需要很多技能、时间和精力的工作。
- 保持代码和文档的同步是一项常被忽视的负担。
- 保持文档友好、有用并支持可发现性是一项难得的技能。
通过大语言模型 (LLM) 的理解能力,所有这些与 API 相关的问题都能得到解决。举例来说,Hexmos 正在开发 LiveAPI,可通过最少的人为干预将任何代码库翻译成友好实用的文档页面,我们已取得了良好效果。我们在这个领域才刚刚起步,所以我看到了未来的巨大改进潜力。
新 API 的推出速度将显著加快
随着 LLM 辅助的 IDE 的普及,可以肯定的是,开发新代码和功能将需要:
- 更少的人力
- 更少的时间
这意味着每个“实现计划”都可以大幅加速,从而实现更快的开发速度。
甚至设计和营销也变得不那么繁琐,从而加快了软件产品,尤其是 API 的上市时间。
这意味着一件事:更多的实验、更多的创新,因而市场上将涌现出更多可供试用的 API。
客户端和服务器代码自我升级:更具韧性的系统
很少有 API 能在一年内不出现故障。随着时间推移,API 保持稳定性的可能性会大幅降低。即使是像 AWS 这样的组织也常常会发生 API 中断,造成问题。
问题的根源在于开发的自然周期:接口变更、版本不匹配、功能被移除或新增、沟通时有时无,等等因素。
在生产者和消费者之间,通常会有一个漫长的协商过程,逐步建立起新的共识。而随着代码库的自动化发现和重构,用于“修复”这些不匹配的“协商”工作量可能会显著减少。
新的 AI 经济正在形成:组建“智能体团队”维护新基础设施
尽管 AI 目前尚未完全胜任独立开发复杂软件的任务,尤其是端到端的,但可以设想,AI 团队可以帮助工程师维护新基础设施和 API。它们可以理解客户消息、协调和解决问题,甚至是修复补丁、升级系统等。
用于设计、实现、测试和共享 API 的新型机器人功能可能会涌现,我预测在这一领域将会发展出一个机器人经济。
软件变得更廉价:大多数 API 价格将下降
如上所述,随着大量自动化技术的实现,软件的“供给侧”可能会超过“需求侧”。你我都知道这意味着什么:在软件开发和维护中,自动化和生产力的提升将导致软件无处不在,供过于求必然会导致价格下降。当然,也可能会出现由更复杂系统驱动的新型 API,其成本可能比以往更高,但从整体上看,多数价格可能会走低。
即将出现情境感知 API:API 可“了解”用户需求以调整响应
目前,API 的“输入”和“输出”往往是静态的,通常只能处理少量有特定含义的字符串和数字片段。然而,未来的 API 输入将会更加复杂。用户的偏好、需求和具体情况可能会成为影响 API 的更重要的“输入”。“我和我的情境”可能比任何其它特性更显著地影响一个 API。在推荐算法等领域,这一趋势已经在发展,但这些算法的生产和维护成本一直很高。不过,这类技术可能会逐渐商品化,并且可能会出现一些通用的结构来处理“上下文”。
结论
Fielding 的 REST 理论奠定了“Web 时代”的特征,而新的自动化浪潮作为“AI 时代”的一部分正在兴起。API 的历史显示了通往当前状态的痛苦而复杂之路。未来无疑将涉及一套新的竞争激烈的标准、错误的转向等,直到新的稳定标准和“做事方式”出现。
延伸阅读
REST API 已经 25 岁了:它是如何形成的,将来可能会怎样?的更多相关文章
- 祝贺 Linux 25 岁:25 个关于 Linux 的惊人真相!【转载】
作者:Javen Fang链接:https://zhuanlan.zhihu.com/p/22222383来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 25 年前的这 ...
- 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...
初来乍到,这个人说话容易让人觉得"狂". "我们将比赛结果提交上去,果不其然,是第一名的成绩."当他说出这句话的时候,表情没有一丝波澜,仿佛一切顺理成章. 他说 ...
- [No000053]我25岁了,是应该继续挣钱,还是选择自己的爱好?--正好庆祝自己25岁生日
你所问的问题正是问题所在.停止做出重大决策,专注于缩小你想到达的地位与你之间的差距. 成功的生活并非由简单而鲜明的决定组成,它们更像这幅图: 但悲伤的是,太多人的状态类似于这幅图: 我知道这听上去很显 ...
- 宇宙最強的IDE - Visual Studio 25岁生日快乐
每位开发者从入门开始或多或少都会接触过 Visual Studio , 现今的 Visual Studio 除了支持传统的 C++ , C# , Visual Basic.NET ,F# 的编程语言外 ...
- 剑指阿里P6,25岁小伙怒斩三面,喜提offer(Java研发岗)
本文提供者:洎扰の庸人 微信公众号:慕容千语的架构笔记.欢迎关注一起进步. 进阿里一直都是身为程序员的我,最初的梦想,经过去年面试蚂蚁金服失败的挫折后,今年再次鼓起勇气投简历,经过一位前辈的内推省了很 ...
- 有趣的条漫版 HashMap,25岁大爷都能看懂
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- MSComm控件与Win32 API操作串口有何区别?
MSComm控件与Win32 API操作串口有何区别? [问题点数:50分,结帖人shell_shell] 收藏帖子 回复 我是一个小兵,在战场上拼命! 结帖率 83.33% 我以前用MSCo ...
- 【】Elasticsearch客户端API使用Demo
Elasticsearch客户端API使用Demo, 转载自官方文档, 以索引雇员文档为示例, 在命令行使用curl演示了一系列的Restful API操作. 1.索引雇员文档 第一个业务需求就是存储 ...
- Android SDK 与API版本对应关系
Android SDK版本号 与 API Level 对应关系如下表: Code name Version API level (no code name) 1.0 API level 1 ( ...
- 如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?
理想的RESTful Web API采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环 ...
随机推荐
- .NET 网络唤醒
本文介绍下电脑设备关机的情况下如何通过网络唤醒设备,之前电源S状态 计算机Power电源状态- 唐宋元明清2188 - 博客园 (cnblogs.com) 有介绍过远程唤醒设备,后面这俩天了解多了点所 ...
- 一个Java类在运行时候,变量是怎么在JVM中分布的呢?
JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的 又名:Java虚拟机的内存模型(JMM)是什么样的. 通过前面两篇文章的学习,我们知道了一个Java类的生命周期及类加载器.我们可以得到 ...
- python pyqt6 设定窗口置顶
self.setWindowFlag(Qt.WindowType.WindowStaysOnTopHint)即可效果一般,页面会出现闪烁一次, # 置顶按钮 self.top_button = QPu ...
- sql转JSON为表
创建方法 : /****** Object: UserDefinedFunction [dbo].[parseJSON] Script Date: 2017/7/11 18:27:28 ******/ ...
- pimp技法浅析--实现轻量级的面向接口编程
pimp.hpp: #ifndef pimp_hpp #define pimp_hpp class CMyComponent{ public: CMyComponent(); ~CMyComponen ...
- HDK Include Header File (1.7)
Download 1.7 | 1.7.1 | 1.7.2 1.7.1 使用方法:编译选项->目录->C++包含文件->添加 [解压目录]\include 1.7.2 使用方法:编译选 ...
- 深度DFS 和 广度BFS搜索算法学习
目录 广度优先的动态图 深度优先的动态图 广度和深度的具体步骤 深度和广度的应用场景 图的两种遍历方式: 深度优先遍历(DFS--Depth First Search) 广度优先遍历(BFS--Bre ...
- SXYZ-7.3训练赛
T1 房 啥啥啥,T1又又又爆了,整个人精神状态 良好. 解题思路 考虑数据保证任意两个房子不重合 建一个结构体存两边 最后判断一下 \(>t\) 加两个 \(==t\) 加一个 == 但是!! ...
- 《Vue.js 设计与实现》读书笔记 - 第12章、组件的实现原理
第12章.组件的实现原理 12.1 渲染组件 在渲染器内部的实现看,一个组件是一个特殊类型的虚拟 DOM 节点.之前在 patch 我们判断了 VNode 的 type 值来处理,现在来处理类型为对象 ...
- 7-11 leetcode 2612
请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠这么多毫秒.要求此函数可以解析任何值. ps: promise 期约函数 (异步函数)的使用 ,promise 是一个对象 new ...