写点什么

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

2008 年 12 月 30 日

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

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

关注

评论

发布
暂无评论
  • REST 的缺点是什么?

    REST架构师邮件列表中最近的一篇帖子引起了Ganesh Prasad的兴趣,促使他总结了自己看到的REST(基于HTTP)在更动态的点对点环境中的若干问题,并提出了解决办法。他建议从Web Services处学习经验。他还提到自己一直致力于提出的Internet Draft规约。

  • REST API 还有新麻烦?

    最近George Reese正在把他和Adrian Cole的一些使用REST和SOAP API开发云应用的经验写出来,在社区中引发了积极响应。刚开始只是些提示和建议,后来则演变成一场辩论,主题是抛开云的因素,使用REST来开发API是否存在真正的问题和误解。

  • RESTful Web Services Cookbook 中文版

    现在说起REST(表述性状态转移),相信大家一定都不会觉得陌生,因为人们对它的认识早已经过了WHAT和WHY的阶段。但在真正要将这种架构风格落地下来的时候往往又会让人有些不知所措,原因就在于我们对HOW关注的太少了。《RESTful Web Services Cookbook》的出现正好弥补了这一空缺,书中包含了大量与设计、实现RESTful Web服务相关的内容,它们都是在日常的设计和开发过程中会经常遇到的东西。本书采用了HTTP报文作为范例,而非具体的开发语言,这消除了语言的限制;而问题描述、解决方案、问题讨论的编排形式让本书也能充当手册使用。相信《RESTful Web Services Cookbook》一定能在你实践REST的道路上助你一臂之力。

  • 微服务通讯方式 RPC vs REST

    2018 年 1 月 9 日

  • REST 反模式

    在本文中,Stefan Tilkov讲解了一些经常出现在自称“符合REST式设计”的应用中的反模式(比如:全部采用GET或POST,忽视缓存及响应代码,误用cookies,忘记超媒体与MIME类型,以及破坏自描述性等),并给出了避免这些反模式的对策。

  • 67 丨 Swift 中的协议

    2019 年 10 月 29 日

  • 工整与自由的风格之争:SOAP 和 REST

    它们来自两个不同的时代,却同时活跃于当今的互联网,并担当着重量级的角色,影响了一批新技术的诞生。

    2019 年 9 月 18 日

  • 请不要再管它们叫 REST API 了

    只是简单地将 CRUD 操作映射到 HTTP 动词的 API 与应用程序状态转移丝毫扯不上关系,你可以把它们叫作 Web API 或 HTTP API,但请不要把它们叫作 REST API。

  • REST 服务开发实战

    本文从实战出发,首先介绍了REST及其应用场景,阐述了如何规划REST服务以及注意事项,而对于选择REST框架以及发布REST服务的注意点,作者提出了自己的观点。

  • 非 RESTful 的微软 REST API 指南

    微软发布了创建“RESTful” API的指南。Roy Fielding将这些与REST没有多大关系的API称为HTTP API。

  • WebSocket:沙盒里的 TCP

    有了WebSocket,我们就可以在浏览器里与服务器直接建立“TCP连接”,获得更多的自由。

    2019 年 8 月 23 日

  • 第 33 讲 | 基于 XML 的 SOAP 协议:不要说 NBA,请说美国职业篮球联赛

    这节我要讲原来的二进制RPC存在的问题以及SOAP的三大要素,协议约定用WSDL、传输协议用HTTP、服务发现用UDDL。

    2018 年 8 月 1 日

  • 打住!SOA、SOA 2.0、ROA 和 WOA,缩略词也太过头了吧?

    当SOA 2.0风头已过,REST vs SOA vs Web服务的争论也不像之前那么激烈的时候,业界又有一些人开始宣扬面向Web的架构(WOA)。可这和现有的东西有任何区别吗(比如REST)?如果有的话,它是什么,它又是怎么样帮助开发者和部署者的呢?来自Burton Group的Anne Thomas Manes认为这一术语有些过头了,也并没有为现在的争论带来任何的价值。

  • 是时候将 WADL 加入到 JAX-RS 中了吗?

    在JavaOne2012上有一场关于Java EE未来的专题讨论,参会者很想知道WADL是否会成为JAX-RS标准的一部分。尽管讨论小组尚未同意,但是观众更倾向于支持WADL而不是反对它。这是不是一件好事儿呢?对于成功的REST来说,WADL是否会继续被视为非必需的呢?

  • 70 丨面向协议编程初探(2)

    2019 年 10 月 29 日

  • 在 RESTful 服务中实现部分更新

    近期Alex Scordellis发表了一篇文章,文章主题是如何针对客户端与RESTFul服务的交互进行建模和设计,实现部分资源的更新。如果能够对资源进行恰当的建模,这个问题似乎可以很容易解决。很多时候考虑到把资源作为实体来支持CRUD操作也是这个问题,包括把建模的资源作为“资源”和提供的服务。

  • 理解本真的 REST 架构风格

    本文是“深入探索REST”专栏系列深度内容中的第二篇,它将带您领略REST架构的起源、与Web的关系、REST架构的本质及特性,以及REST架构与其他架构风格之间的比较。

  • GOTO Berlin: Web API 设计原则

    在邮件列表和讨论区中有很多有关于REST和Web API的讨论,而在GOTO Berlin大会上,InnoQ的首席顾问Oliver Wolf分享了他对这些讨论的一些见解,包括端点、领域模型、缓存、版本等内容。

  • 开发者怎样才能写出好的 API?

    本文首先阐述了RESTful风格API的基础理论知识以及Richardson成熟度模型,随后讨论了好的API应该具有哪些特征,最后对流行的API实现方式,即GraphQL和RESTful,进行了对比。

发现更多内容

为什么行业老大经常和老二合并?

石云升

市场垄断 9月日更

如何拥有自己的openLooKeng?超详细的安装配置指导看这里

openLooKeng

Go- 文件读写-2

HelloBug

go 文件读写

应急响应篇:windows入侵排查

网络安全学海

黑客 网络安全 信息安全 WEB安全 应急响应

Go- 数据格式解析

HelloBug

go json xml gob

【VueRouter 源码学习】第六篇 - 路由匹配的实现

Brave

源码 vue-router 9 月日更

如何从业务中抽取出通用性模板或框架-通用权限管理框架

张音乐

Java 设计模式 9月日更

浪潮云洲×明风机械:让工业“哑设备”发声

浪潮云

云计算

Android | 音视频方向进阶路线及资源合集

轻口味

android 音视频 9月日更

SpringMVC工作流程

咿呀呀

springmvc 9月日更

弱网下的极限实时视频通信

声网Agora

音视频 编码 极限视频通信

数据中台是什么?

奔向架构师

数据中台 数据仓库 9 月日更

架构1期模块七作业

五只羊

架构实战营

市值管理机器人特点简析,交易所刷交易量机器人搭建

量化系统19942438797

市值机器人 市值管理

运维工程师主要是做什么的?和网络工程师有啥区别?

行云管家

云计算 运维 网络 IT运维

2021年最新高频Java面试题:分布式+中间件+高并发+算法+数据库+设计模式

程序员小毕

Java spring 架构 面试 分布式

华为云GaussDB(for Redis)发布全新版本,两大核心特性正式亮相

华为云数据库小助手

性能调优 GaussDB GaussDB ( for Redis ) 华为云数据库

SEO行业的困境:转型还是夹缝中求生存

石头IT视角

【数据库】数据库访问控制策略包含哪些?都一样吗?

行云管家

数据库 阿里云

ipfs矿机挖矿原理是什么?ipfs矿机怎么搭建?

IPFS老胡

ipfs矿机挖矿原理是什么 ipfs矿机怎么搭建

详解微信异步队列 MQ 2.0 的功能优化及拓展思路

OpenIM

openLooKeng+Ranger+LDAP 认证鉴权能力演示

openLooKeng

大数据 openLooKeng Ranger

CSS架构之tool层

Augus

九月日更

首发10万字Mysql实战文档,几乎涵盖你需要的所有操作|超清PDF

今晚早点睡

MySQL 程序员 JAVA;、

网络攻防学习笔记 Day130

穿过生命散发芬芳

数据安全 9月日更

模块7

脉动

王者荣耀商城异地多活架构设计

木云先森

架构训练营

模块七作业

Clarke

博睿数据亮相 2021 服贸会,以智能运维赋能数字化体验

博睿数据

实时移动通信中基于时空域联合约束的低照度视频增强技术

OpenIM

玩转TypeScript 工具类型(上)

有道技术团队

typescript 前端 客户端

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