春争日,夏争时,扫码抽取夏日礼包!!! 了解详情
写点什么

争论:REST 需要描述语言吗?

  • 2007 年 6 月 12 日
  • 本文字数:1773 字

    阅读完需:约 6 分钟

追踪上周在此讨论的关于REST vs. WS-* 的争论,值得注意的是,以REST 化服务契约为主题的争论在最近几天日嚣尘上。浮现出的问题是REST 是否需要契约(即按照WSDL 的方式),更更根本的问题是有了契约的REST 还依旧是REST 吗。 Aristotle Pagaltzis 的问题:“REST 需要服务描述语言吗?” 揭开了争论的序幕:

“日前,有人在 rest-discuss 发问是否有描述 REST 服务的标准方法。该问题一再露面(作为回应,通常会画一个指向 WADL 努力的箭头),似乎意味着关于 REST 的一个流行的误解。我认为使用类 WSDL 语言描述 REST 化服务根本就是自相矛盾的说法……”

对此, Paul Mueller 回应道

“此处,我们讨论的是契约。契约必须以某种方式正规化。英语并非最好的使用语言,尤其是因为我们有如此多的更精确语言可供选择。

我的这个想法这实际上是对我关于数据序列化想法的扩展,服务只是需要被元描述的下一级事物。”

Mark Baker 紧跟而上,他同意 Aristotle 的观点:REST 拥有(以及需要)的唯一契约就是以 4 个动词为基础的 HTTP 协议,这 4 个动词是——POST、GET、DELETE、PUT(事实上 HTTP 1.1 还定义了另一个动词 - HEAD,但是它使用并不广泛)。 Mike Herrick 认为契约确实能增加价值:

“我认为,REST 客户端开发者至少期望能有模式,用来定义在请求 / 响应有效负荷中想出现的东西。恕我直言,WADL 做了非常不错的工作,而且没有画蛇添足。如我所说,与 WSDL 相比较,它是个不错的东西。当 HTTP 是唯一选择的时候,事情是如此的简单(即,相比于愚蠢的协议不可知论调)。如果你不打算使用 WADL,那你就不得不将服务以枯燥无聊的方式文档化。至少,WADL 看起来是一种真正简化文档事物的方法。”

Bobby Woolf(因企业集成模式而闻名)同样认为 REST 需要声明性接口并怀疑当 REST 最终获得这些能力时,结果是否还会与 WSDL 有什么显著不同。John Heintz建议在其间做些手脚,使用他称之为路标的东西,而非描述语言。他的想法是:路标在运行时可以被解析,这将使它们适于改变。问题的症结似乎是:服务消费者对于接口的信心,它由它们所消费的服务定义。这个视角始于 Stefan Tilkov 的评论,他认为存根(stub)和骨架类(skelton)有问题。 Don Box 回复说你必需对你得到的消息结构有信心。对此,Stefan 的回应:

“我同意这一点——我的代码就依赖文档中一些元素和属性。但问题是,即使我的应用只访问它所需要的 XML 中 20% 的元素和属性,列集(散列)/ 序列化(反序列化)((un)marshaling/(de)serialization)代码同样要求在 XML 和模式之间进行完美地匹配。目前代码产生时就是如此。换句话说:尽管我的应用代码能容忍至少一些变动,但是产生的底层代码则不行。”

Mike Glendinning 的评论强调了 Stefan 的观点,他认为当用户只使用返回消息的 20% 时,为其本身定义新契约更有效。或者如 Joe Gregorio 写下的(在一个相当长的 Q&A 风格帖子中,它通篇都是关于我们是否需要 WADL):

“Q:人们打算想要描述接口,那有什么坏处? A:是的,人们想要描述接口,并且那些描述是脆弱的。如果今天我下载一个 WADL 并编译我的客户端,那么明天就会因你改变服务而崩溃。相反,如果你使用超文本(在链接后跟超文本和客户端状态,或基于超文本和客户端状态构造请求),那么当你改变服务器或 URI 结构时,接口将不会被破坏。”

最后,考虑到上文 Stefan 博客中的 2 条评论,问题可能比“REST 是否需要正式的契约”更根本,即“我们需要接口吗?”。首先看看 Steve Jones 的评论:

“契约是个好东西,这已经是被证明的了,我仍然奇怪为什么 REST 人们不喜欢它们。它几乎是理论和实践的东西,在理论上并没有规定,在实践上却是如此。”

与 Eric Johnson 所说相比较:

“……就我看来,被 REST 所吸引(不论以什么形式)的人们,是反抗基于接口的编程而甚于 WS-* 本身——至少我的理由是如此……”

查看英文原文: Debate: Does REST Need a Description Language ?。 - - - - - -

译者简介:胡键,自 2000 年西安交通大学硕士毕业后一直从事软件开发。2002 年开始使用 Java,在项目开发中经常采用 OpenSource 工具,如 Ant、Maven、Hibernate、Struts 等,目前正在研究信息集成方面的规范和技术。可以通过 jianhgreat@hotmail.com 与他联系,或访问博客: http://foxgem.javaeye.com/ 。参与 InfoQ 中文站内容建设,请邮件至 china-editorial@infoq.com

2007 年 6 月 12 日 19:491135
用户头像

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

关注

评论

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

工作原则:决策要基于数据的支撑

Janenesome

高效工作 思考 原则

玄铁重剑,我用过最贵重的键盘

池建强

ipad 苹果 键盘

Java新技术:封闭类

范学雷

Java 架构 编程语言

Android | Tangram动态页面之路(二)介绍

哈利迪

android

webpack入门系列之二——插件使用及热更新打包

子铭

Web

LeetCode 781. Rabbits in Forest

liu_liu

LeetCode

“我XXXX,还能学编程吗?”

三号无名指

编程 程序员 工具 入门

职涯思考

Kevin Z

职业 思考 工程师思维 硬件 工程师

Redis实现热卖商品排行榜

北漂码农有话说

redis

Rust 与区块链四月月刊

Aimee 阿敏

区块链 rust 加密货币 crypto

程序员小白的个人思考

程序员小岑

程序员 职场 思考 感悟

Web3极客日报#129

谢锐 | Frozen

区块链 独立开发者 技术社区 Rebase Web3 Daily

Python3.6.1官方文档练习——初入江湖(二)

小匚

Mac 使用笔记

FeiLong

面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)

一枝花算不算浪漫

源码 并发编程 ThreadLocal

MySQL常用权限说明

一个有志气的DB

MySQL 用户研究

《零基础学 Java》 FAQ 之 5-如何在IntelliJ IDEA里配置JDK

臧萌

Java jdk intellij

《零基础学 Java》 FAQ 之 6-Java里Bean这个名字怎么来的

臧萌

Java spring

十大经典排序算法总结

淡蓝色

Java 算法 计算机基础 排序

克服恐惧,勇于分享

孙苏勇

程序员 分享 工作

谈谈控制感(5):怎么破控制感损失的局

史方远

职场 心理 成长

Web3极客日报#141

谢锐 | Frozen

区块链 独立开发者 技术社区 Rebase Web3 Daily

回“疫”录(18):536公里的路

小天同学

疫情 回忆录 现实纪录 纪实 返程

松哥手把手带你入门 Spring Security,别再问密码怎么解密了

江南一点雨

Java spring Spring Boot spring security

不要做软件开发团队中打破窗户的那个人

程序员小岑

程序员 思考 感悟 软件开发 团队

要做医生,不要做卖药的

Janenesome

高效工作 思考 沟通

修改网桥默认地址

奔跑的菜鸟

Docker

聊聊我对技术一些性质的认识

Tanzv

技术 思考 新人

一文带你看清HTTP所有概念

cxuan

HTTP

LeetCode 513. Find Bottom Left Tree Value

liu_liu

LeetCode

VSCode 集成 Haskell 环境

liu_liu

vscode haskell hie Haskell Language Server

争论:REST需要描述语言吗?_SOA_Arnon Rotem-Gal-Oz_InfoQ精选文章