写点什么

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:144360
用户头像

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

关注

评论

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

瓴羊Quick BI工具重建企业数字体系,数据处理不再难

巷子

手把手教会你 | 多用户-服务器聊天室应用软件开发

TiAmo

多线程并发 数据库编程 服务器聊天室

Stable Diffusion WebUI汉化

IT蜗壳-Tango

三周年连更

Syslog-ng RHEL 的安装和配置

HoneyMoose

“前端”工匠系列(一):合格的工匠,究竟该搞什么 | 京东云技术团队

京东科技开发者

前端 编码格式 Vue 3 企业号 5 月 PK 榜

在 Go 中如何使用 Viper 来管理配置

江湖十年

golang 后端 日志

【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件

洛神灬殇

redis 分布式锁 三周年连更 动手实现

Flink运行架构

阿泽🧸

flink 三周年连更

JS中数组随机排序实现(原地算法sort/shuffle算法)

不叫猫先生

JavaScrip 算法、 三周年连更

Docker安全中的一些技术工具

穿过生命散发芬芳

Docker 三周年连更

高级滤镜效果:Topaz Photo AI Mac电脑版

真大的脸盆

Mac Mac 软件 图像编辑处理 图像优化工具

开心档之C++ 指针

雪奈椰子

三顾茅庐,七面阿里,终拿25k*16offer,我的面试历程

程序知音

Java 后端 java面试 Java进阶 Java面试八股文

最高可达4000万元!浙江台州|台州市“500精英计划”引才政策申报

科兴未来News

Web前端已死?别带节奏了,说白了就是“卷”

引迈信息

前端 大前端 低代码 java 并发 JNPF

vivo积分任务体系的架构演进-平台产品系列05

vivo互联网技术

架构演进 积分 任务体系

火山引擎DataTester上线全新MAB智能调优实验

字节跳动数据平台

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

Matlab实现深度学习

袁袁袁袁满

三周年连更

IDP中的黄金路径究竟是什么?

SEAL安全

IdP 平台工程 内部开发者平台 企业号 5 月 PK 榜 黄金路径

一起单测引起的项目加载失败惨案 | 京东云技术团队

京东科技开发者

spring 单元测试 bean 企业号 5 月 PK 榜 Javaassist

深扒!阿里人用6部分讲完Java性能调优:多线程+设计模式+数据库

做梦都在改BUG

Java 性能优化 性能调优

牛掰!阿里人用7部分讲明白百亿级高并发系统(全彩版小册开源)

做梦都在改BUG

Java 系统设计 高并发

Django笔记二十一之使用原生SQL查询数据库

Hunter熊

Python sql django connection

程序员必知必会!阿里内部热捧“Spring全线笔记”太完整了

程序知音

Java spring java架构 Java进阶 后端技术

开心档之C++ 重载运算符

雪奈椰子

Java泛型详解

timerring

Java

探究Spring中Bean的线程安全性问题

做梦都在改BUG

Java spring 线程安全 bean

java 中为什么有了 spring 还再来个 springboot?

海拥(haiyong.site)

三周年连更

瓴羊Quick BI工具助力企业,数据处理效率翻番!

夏日星河

FFmpeg从入门到精通-云享读书会总结

DS小龙哥

三周年连更

腾讯云大佬亲码“redis深度笔记”无废话全精华!

程序知音

Java 数据库 redis Java进阶 后端技术

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