报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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

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

关注

评论

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

【python小游戏】用python写一款小游戏--贪吃蛇

BROKEN

8月日更 8月月更

Service Mesh落地路径

阿泽🧸

Service Mesh 8月月更

区块链或者智能合约开发的 5 种最佳编程语言

devpoint

区块链 以太坊 8月月更

长达四年的减肥记录

Amazing_eve

#开源

【爬虫+可视化】Python爬取疫情并可视化处理数据(爬虫入门案例)

BROKEN

Python 8月月更

python绘制一个时间的七段数码管实例基本的七段数码管绘制

BROKEN

8月日更 8月月更

Nacos配置中心之客户端长轮询

急需上岸的小谢

8月月更

七日算法先导(三)—— 快速排序,插入排序

工程师日月

8月月更

手写分布式配置中心(1)

分享干货的你

java; spring-boot SpringCould 签约计划第三季

【数据挖掘概论】数据挖掘的简单描述

晴天

8月月更

2022前端秋招vue面试题

helloworld1024fd

Vue

多个平台显示IP属地,必须大力推行互联网实名制

石头IT视角

C++对象的初始化和清理之构造函数和析构函数分析与实例(一)

CtrlX

c++ 面向对象 后端 代码 8月月更

Go 语言快速入门指南:什么是 TLS 安全传输层协议

宇宙之一粟

安全 Go 语言 8月月更

工业物联网 —— 新型数据库的召唤

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

克服项目管理中恐惧心理

踏雪痕

项目管理 8月月更

动态内存开辟(C语言)

孤衫

编程语言 C语言 动态内存 8月月更

开源一夏 | 云服务器ECS安装Mysql、JDK、RocketMQ

六月的雨在InfoQ

开源 8月月更

Axure9基本交互操作(一)

乔乔

8月月更

git操作

Jason199

git 8月月更

头脑风暴:完全背包

HelloWorld杰少

8月月更

前端常考react相关面试题(一)

helloworld1024fd

React

开源一夏|OpenHarmony如何查询设备类型(eTS)

坚果

开源 HarmonyOS OpenHarmony 8月月更

开源一夏 | 基于若依springboot架构实现数据多维统计

六月的雨在InfoQ

开源 8月月更

那些年,在Linux指令上踩过的坑~

芒果酱

Linux 签约计划第三季

SRv6网络的安全解决方案

穿过生命散发芬芳

8月月更 SRv6

Discourse 清理存储空间的方法

HoneyMoose

学生管理系统架构设计

张立奎

Android条件控制宏编译

桑榆

8月月更

《MySQL入门很轻松》第2章:MySQL管理工具介绍

乌龟哥哥

8月月更

手写柯里化 - toString 理解

掘金安东尼

JavaScript 前端 函数式 8月月更

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