AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

Roy Fielding:REST API 必须是超文本驱动的!

  • 2008-12-30
  • 本文字数:1952 字

    阅读完需:约 6 分钟

Fielding 博士的那篇经典论文中文版)对万维网架构的贡献可谓是居功至伟。可想而知,当REST 一词变得流行起来之后,其滥用甚至是“挂羊头卖狗肉”的现象是不可避免的。而糟糕的是,对于那些没有时间、也没有耐心去仔细阅读该论文的人来说,可能就会在看过或用过某些号称具有REST 风格的应用之后对REST 本身产生错误的理解,进而在错误的思想指导之下错误地运用REST。这正是其创造者本身所不愿意看到的。

这不,Fielding 博士本人终于按捺不住发飚了。在其10 月28 日发表的博文《REST API 必须是超文本驱动的》中,博士坦言了他的失望,并对 SocialSite REST API 提出了批评。同时他还指出,除非应用状态引擎是超文本驱动的,否则它就不是 RESTful 或 REST API。据此,他给出了 REST API 应该具备的条件:

  • REST API 不应该依赖于任何通信协议,尽管要成功映射到某个协议可能会依赖于元数据的可用性、所选的方法等。
  • REST API 不应该包含对通信协议的任何改动,除非是补充或确定标准协议中未规定的部分。
  • REST API 应该将大部分的描述工作放在定义用于表示资源和驱动应用状态的媒体类型上,或定义现有标准媒体类型的扩展关系名和(或)支持超文本的标记。
  • REST API 绝不应该定义一个固定的资源名或层次结构(客户端和服务器之间的明显耦合)。
  • REST API 永远也不应该有那些会影响客户端的“类型化”资源。
  • REST API 不应该要求有先验知识(prior knowledge),除了初始 URI(书签)和适合目标用户的一组标准化的媒体类型(即,它能被任何潜在使用该 API 的客户端理解)。

按照 Fielding 博士这些条件,一大批我们熟知的、号称是 RESTful 的应用和架构无疑都不属于 REST 的行列,包括 Google/Amazon/Yahoo! 等大公司所提供的 API 和应用。可想而知,该文发表之后的反响是巨大的,其后长长的回复列表即是明证。面对诸多疑问,Fielding 博士一一做了回复。其言论整理如下:

  • 对于“超文本”,Fielding 说道:“我所说的超文本指的是信息与控件的同时呈现,这样一来,信息便具有自解释性(affordance),从而用户(或程序)可以通过它获取选项、并作出选择。”(回复#3)
  • 他认为“真正的 RESTful API”就想超文本一样,信息的每个寻址单元显式地(如,link 和 id 属性)或隐式地(如,由媒体类型定义和表示结构推导而来)携带一个地址。(回复#5)鉴于超文本中已经包含了寻址信息,故而他认为接口并不一定需要是可发现的。(回复#11)
  • 对“为什么会有如此多的人对 REST 理解有误”之一问题,Fielding 承认由于他时间的关系对媒体类型的设计未在论文中做详细阐述,但同时强调这并非表示他认为这些内容不重要。(#8)
  • 对于资源建模的目的,Fielding 表示这是为了找出哪些资源值得标识、表示和操作。(回复#11)
  • 对于先验知识,Fielding 认为客户端是允许有先验知识的,但 REST 强调的是这些先验知识应该以一种标准化的形式出现。(回复#20)
  • 对于批操作,Fielding 认为人们觉得需要批操作是因为他们没有理解资源的范围。他指出资源并非存储项(至少不等同于后台中某些存储项),并且同一资源状态可以由多个资源来分担。如果谁发现他需要一个批操作,那么很可能只是因为他没有定义足够的资源。(回复#21)
  • 不要混淆了应用状态和资源状态,前者指的是计算某个任务的用户应用的状态,后者则是指作为某个服务所暴露出的状态(回复#22)
  • 媒体类型标识出了定义如何处理表示的规范。一旦表示以携带了类型化关系的超文本形式被提供,那么自动化的代理就能像人一样在这些应用之间穿梭自如。(回复#30)
  • 对于安全性的问题,Fielding 说道:“RESTful 系统实现安全操作的方式和其他任何消息传递协议的方式是一样的:不是封装消息流(SSL、TLS、SSH、IPspec……),就是加密消息(PGP、S/MIME 等)。”(回复#34)

在这样短的一篇新闻中很难详细的罗列该文所有的内容和评论,尤其是其间不乏某些很有价值的讨论和观点。请一定要阅读一下 Fielding 博士的这篇引起广泛讨论的文章。另外,REST 论文中文版的译者之一 dlee 也在 JavaEye 论坛上就此文发起了讨论。其中他这样写道:

Fielding 发表这篇 blog,这件事情其实并不出我的意外。我在两年前就很奇怪世界上为何一下子冒出来这么多 REST 专家。那一年,我翻译了《Ajax Patterns and Best Practices》。这本书的内容非常深入,作者 Christian Gross 宣称他所设计的所有模式遵循的都是 REST 架构风格。但是 Gross 先生却没有将 REST 的来龙去脉讲清楚,甚至只字未提 Fielding 的那本著名的博士论文。 REST 似乎是一个技术界的罗生门,每个人的描述都不一样,而他们都坚信自己的理解才是正确的。……

现在真相大白了,Fielding 对于 REST 架构风格定下了如此严格的判断标准,世界一下子清静了。

附注:非常感谢《RESTful Web Service 中文版》的译者徐涵对本文提出的意见和帮助。

2008-12-30 20:144434
用户头像

发布了 255 篇内容, 共 61.5 次阅读, 收获喜欢 10 次。

关注

评论

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

如何用Chat GPT打造爆款Listing

kookeey代理严选

代理IP 跨境电商 ChatGPT ChatGPT4 亚马逊运营

Spring 应用合并之路(二):峰回路转,柳暗花明

京东科技开发者

硬核、高能,龙蜥社区走进中科方德 MeetUp 圆满结束(附技术PPT下载)

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥meetup

35 位委员参会,龙蜥社区 11 月技术委员会会议圆满结束

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥技术委员会

数据安全标准合辑之「实施指南类」(附下载)

极盾科技

Axure RP 11:交互设计新高度,打造极致用户体验!

Rose

云起无垠创始人参与模糊测试研究被网络安全四大顶级会议—NDSS2024收录

云起无垠

文献解读-Processing UMI Datasets at High Accuracy and Efficiency with the Sentieon ctDNA Analysis Pipeline

INSVAST

基因测序 液体活检 生信分析 Sentieon 变异检测

Mint Blockchain:用 NFT 链接全球消费者的 Layer2 网络

NFT Research

NFT #Web3 L2

边缘计算+人工智能:让设备更聪明的秘密

天津汇柏科技有限公司

边缘计算 AI 人工智能

《Django 5 By Example》阅读笔记:p493-p520

codists

Python django

KAG 技术实践分享|信创环境下实现高效知识图谱抽取

可信AI进展

OmniOutliner 5 Pro:项目管理利器,高效规划每一步!

Rose

Cocktail for Mac(系统清理)注册激活码

Rose

SnippetsLab for Mac(mac代码管理器)v2.6激活版

Rose

产品经理如何进行竞品分析

易成研发中心

产品经理 竞品分析

开源进校园,开放原子校源行 Meetup(中南大学站)圆满结束

OpenAnolis小助手

操作系统 龙蜥高校行

彻底改变你的代码:JavaScript linter—Oxlint

京东科技开发者

倒计时1天!龙蜥社区可信计算SIG MeetUp即将在北京召开

OpenAnolis小助手

操作系统 可信计算 龙蜥meetup

PDF编辑软件 Acrobat Pro DC 2019 for Mac中文激活版

Rose

webGL开发框架及特点

北京木奇移动技术有限公司

软件外包公司 数字孪生开发 webgl开发

QT软件外包开发流程

北京木奇移动技术有限公司

软件外包公司 QT外包开发 QT开发公司

在Unity中训练智能体

北京木奇移动技术有限公司

AI应用 AI智能体 软件外包公司

喜报!MIAOYUN再获国家高新技术企业认定

MIAOYUN

云原生 信创 高新企业 高新技术企业 高企认定

观测云产品更新 | 场景图表、基础设施、监控告警策略等

观测云

产品迭代

「百度集团」资深副总裁、原IDG负责人李震宇加入“华为系”具身智能赛道初创公司!

机器人头条

自动驾驶 华为 人形机器人 具身智能

京东电商搜索:大模型生成式检索优化实践

京东零售技术

大模型

数据安全标准合辑之「检测评估类」(附下载)

极盾科技

提供方耗时正常,调用方毛刺频频

京东科技开发者

OASA走进三未信安、奇安信和360,共建龙蜥安全生态

OpenAnolis小助手

操作系统 龙蜥安全联盟

Roy Fielding:REST API必须是超文本驱动的!_SOA_胡键_InfoQ精选文章