写点什么

REST 和 SOAP:谁更好,或者都好?

  • 2010-06-04
  • 本文字数:2200 字

    阅读完需:约 7 分钟

如今,Web 开发者的可选技术相当之多;从简化的数据库访问技术,到易用的中间件服务包装技术,以及各种有趣的客户端软件等等,一应俱全。所有这些产品和工具,都是为了帮助 Web 开发者用最快的速度开发出最好的 Web 应用。

然而,拥有大量可选软件方案以及为 Web 应用的特定部分选用特定方案,都是具有挑战的事;而且,现在 Web 开发者必须持续跟踪各种不断变化着的标准与方法。

举个例子,Web 服务技术就有 SOAP(Simple Object Access Protocol,简单对象访问协议)和 REST(Representational State Transfer,表示性状态转移)这两种方案。它们都是有效的方案,但在具体场合下采用哪种方案好,这要取决于 Web 开发者。

目前,大部分 Web 开发者似乎都了解 REST——一种采用标准 URI 进行调用的方案。REST 很容易理解,而且只要是支持 HTTP/HTTPS 的客户端 / 服务器就支持它。你可以用 HTTP GET 方法来执行命令。所以,开发者们感受到的 REST 的优势是:开发简单、只需依托现有 Web 基础设施、以及学习成本低。

然而,SOAP 作为一种古老的 Web 服务技术,短期内还不会退出历史舞台。而且,随着 SOAP 1.2 的出现,SOAP 印象中的一些缺点已得到改进,采纳率和易用程度也都得到提高。另需注意的是,从 W3C SOAP 1.2 版开始,SOAP 这一缩写不再代表 Simple Object Access Protocol(简单对象访问协议),而是仅仅作为协议名称而已。

相对 REST 而言,SOAP 1.2 多出一些开销,不过这些开销也带来了一些好处。首先,SOAP 在三个方面离不开 XML(Extensible Markup Language,可扩展标记语言):SOAP 信封(envelope)是基于 XML 的,它定义了消息里有什么以及如何处理它;一套用于数据类型的编码规则;过程调用和响应的规划。SOAP 信封由传输协议(HTTP/HTTPS)发出,RPC(Remote Procedure Call,远程过程调用)得到执行,然后一个 XML 文档随 SOAP 信封返回。

需要注意的是,基于“通用”传输协议是 SOAP 的一个优点。REST 目前基于 HTTP/HTTPS;而 SOAP 可支持任何传输协议,从 HTTP/HTTPS 到 SMTP(Simple Mail Transfer Protocol,简单邮件传送协议),甚至 JMS(Java Messaging Service,Java 消息传递服务)。不过,由于 XML 较为冗长且解析费时,因此采用 XML 也成为一个弊端。

不过,对 Web 开发者来说的好消息是,目前上述两种方案都是行之有效的方案。REST 和 SOAP 都能解决许多 Web 方面的问题与挑战,而且在许多情况下,它们各自都能满足开发者的要求,也就是说可互换使用。

但很多人不知道,这两种技术可以混合搭配使用。REST 很好理解,且极易上手;不过由于它缺乏标准,因此只被看作是一种架构方法。与之相比,SOAP 是一个工业标准,它具备良好定义的协议,以及一套良好确立的规则,在大型和小型系统中均有采用。

因此,REST 的适用场合包括:

  • 有限的带宽和资源 别忘了返回的结构可以采用(由开发者定义的)任何格式。另外,由于 REST 采用标准的 _GET_、PUT、_POST_ 和 _DELETE_ 动词,因此可被任何浏览器所支持。除此以外,REST 还可以使用为目前大多数浏览器支持的 _XMLHttpRequest_ 对象,这为 AJAX 增色不少。
  • 完全无状态的操作 对于那些需多步执行的操作,REST 并非最佳选择,采用 SOAP 更合适。但是,如果你需要无状态的 CRUD(Create/Read/Update/Delete,创建 / 读取 / 更新 / 删除)操作,那么应采用 REST。
  • 缓存考虑 若要利用无状态操作的特性,使得信息可被缓存,那么 REST 是很好的选择。

以上已经覆盖很多方案了,那么,为什么还要考虑 SOAP 呢?正如前述,SOAP 比较成熟而且是经过良好定义的,具有完整的规范。而 REST 只不过是一种方法,对开发未作任何规约;因此,假如你遇到以下场合,那么 SOAP 是最佳选择:

  • 异步处理与调用 如果你的应用需要确保可靠性与安全性,那么请采用 SOAP。SOAP 1.2 为确保这种操作补充定义了 WSRM(WS-Reliable Messaging)等标准。
  • 形式化契约 若提供者 / 消费者双方必须就交换格式取得一致,那么采用 SOAP 更合适。SOAP 1.2 为这种交互提供了严格的规范。
  • 有状态的操作 如果应用需要上下文信息与对话状态管理,那么应采用 SOAP。SOAP 1.2 为此补充定义了 WS-Security、WS-Transactions 和 WS-Coordination 等标准。相比之下,REST 方法要求开发者自己来实现这些框架性工作。

正如你所看到的,REST 和 SOAP 各自有其用武之地。它们在安全性和传输层等方面有着自己的潜在问题,不过它们都能完成任务,而且在许多情况下,它们都丰富了 Web 的技术手段。因此,就这一论题,其实最好的原则就是灵活性原则;因为至少在现今的 Web 开发中,无论面对何种问题,Web 开发者们总有办法运用好这两种技术中的一种。

关于作者

Mike Rozlog 是 Embarcadero 科技公司的高级产品主管。他的主要工作是确保 Embarcadero 公司推出开发工具满足全世界开发者们的期望。他的大部分时间被致力于从技术和业务两个方面来介绍讲解 Embarcadero 的产品与服务,其听众是遍布全球分析师及其他听众。Mike 曾工作于 CodeGear,一个于 2008 年被 Embarcadero 收购的开发工具团队。之前,他为 Borland 公司工作了八年,担任过包括首席技术架构师在内的许多职位。作为一名知名作者,Mike 出版了很多书。他最近的作品 _《Mastering JBuilder》_ 已由 John Wiley & Sons 出版。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2010-06-04 01:3340638
用户头像

发布了 63 篇内容, 共 26.2 次阅读, 收获喜欢 11 次。

关注

评论

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

java开发之Spring集成MyBatis知识分享

@零度

Java spring mybatis

Ceph核心概念解读

总想做点什么

分布式存储 Ceph 云存储 云计算,

探秘 k8e:极简 Kubernetes 发行版

张晓辉

Kubernetes 云原生

vivo 评论中台的流量及数据隔离实践

vivo互联网技术

mongodb 中台 分布式

从原理到操作,让你在 APISIX 中代理 Dubbo 服务更便捷

API7.ai 技术团队

微服务网关

盘点冬奥会上的那些“黑科技”,你也可以掌握它!

博文视点Broadview

aPaaS将如何改变软件行业?

华为云开发者联盟

云计算 软件 软件开发 SaaS aPaaS

新思科技BSIMM评估为安全团队提供“他山之石”

InfoQ_434670063458

汽车 新思科技 软件定义汽车 软件安全 BSIMM评估

【高并发】一文解密诡异并发问题的第一个幕后黑手——可见性问题

冰河

Java 并发编程 多线程 异步编程 精通高并发系列

推荐学java——Spring与web项目

逆锋起笔

Spring web idea web web项目 idea spring

百度爱番番实时CDP建设实践

百度Geek说

后端

百度APP视频播放中的解码优化

百度Geek说

百度 性能优化 视频

如何让代码代码管理变的更安全更高效 | 云效开发篇

阿里云云效

阿里云 DevOps 云原生 代码管理 Codeup

面试突击20:进程和线程有什么区别?

王磊

Kubernetes HPA 基于 Prometheus 自定义指标的可控弹性伸缩

张晓辉

Kubernetes 弹性 HPA

阿里巴巴DevOps文化浅谈

阿里云云效

阿里巴巴 阿里云 DevOps 云原生 研发

“1天一朵云”,这是如何做到的?

华为云开发者联盟

数字化转型 软件架构 华为云 华为云Stack 全栈云平台

Java11特性-效能翻倍的HttpClient

蜜糖的代码注释

Java 后端技术 2月月更

React Fragment介绍与使用

编程江湖

React

做了一份前端面试复习计划,保熟~

CRMEB

永中软件加入龙蜥社区,共建开源新生态

OpenAnolis小助手

Linux 开源 永中

设备接入服务,看完这篇给你整的明明白白

华为云开发者联盟

物联网 IoT 华为云 设备接入服务 设备

在阿里,我们如何管理代码分支?

阿里云云效

阿里云 DevOps 云原生 研发 分支管理

Java 字符串常见的操作

编程江湖

大数据开发之运维面试题汇总分享

@零度

面试题 大数据运维

分配任务的人才是团队的核心成员

panda

管理 限界上下文 任务分配

如何解决Python项目在VScode中跨文件夹导包问题

IT蜗壳-Tango

IT蜗壳教学 2月月更

如何帮助金融客户“用好云”?

阿里云云效

阿里云 运维 云原生 云平台 阿里云混合云

不断突破,稳中求进——我的移动端跨平台开发技术回顾与展望| 社区征文

No Silver Bullet

跨平台 移动端 新春征文 2月月更

鸿蒙轻内核源码分析:文件系统LittleFS

华为云开发者联盟

鸿蒙 文件系统 Flash LittleFS LiteOS-M内核

前端开发之js栈内存和堆内存的区别

@零度

JAVA开发 堆内存 栈内存

REST和SOAP:谁更好,或者都好?_SOA_Mike Rozlog_InfoQ精选文章