1992年网站(Web Sites)是在Web浏览器和Web服务器直接通过HTTP传输HTML。
2000年WS-* (Web Services)是在客户端和服务器之间基于HTTP传输SOAP XML格式的数据,服务端用WSDL来规定契约。
2007年RESTful (Web Services)是在客户端和服务器之间基于HTTP传输JSON、PO-XML、RSS格式的数据,服务端用WADL来规定契约。
解决企业软件标准化的问题
企业计算的互用性标准
一个提供消息、描述、发现规范的分层架构
能够快速从底层构建提供解决方案
工具可以将复杂性屏蔽
Web应用(Web Applications)与 企业计算(Enterprise Computing)
一个关于Web Services文档的不完全统计(http://www.tbray.org/ongoing/When/200x/2004/09/21/WS-Research)
Group | Spec | Page Count |
安全Security | ||
Web Services Security (O) | 56 | |
UsernameToken Profile (O) | 15 | |
X.509 Certificate Token Profile (O) | 16 | |
Policy Language (M) | 13 | |
Trust Language (M) | 41 | |
Secure Conversation Language (M) | 17 | |
Web Services Federation Language(M) | 28 | |
WS-Federation: Active Requestor Profile (M) | 14 | |
WS-Federation: Passive Requestor Profile (M) | 13 | |
Kerberos Binding (M) | 17 | |
可靠消息Reliable Messaging | ||
Reliable Messaging (M) | 21 | |
事务Transactions | ||
Coordination (M) | 16 | |
Atomic Transaction (M) | 10 | |
Business Activity Framework (M) | 13 | |
元数据Metadata | ||
WSDL 1.1 (W) | 32 | |
Policy Framework (M) | 15 | |
Policy Attachment (M) | 10 | |
Policy Assertions Language (M) | 9 | |
Dynamic Discovery (M) | 22 | |
Metadata Exchange (M) | 23 | |
消息Messaging | ||
SOAP 1.2 Primer (W) | 39 | |
SOAP 1.2 Messaging Framework (W) | 47 | |
SOAP 1.2 Adjuncts (W) | 25 | |
Addressing (M) | 15 | |
MTOM (W) | 13 | |
Enumeration (M) | 27 | |
Eventing (M) | 21 | |
Transfer (M) | 17 | |
SOAP-over-UDP (M) | 7 | |
管理Management | ||
Web Services for Management (M) | 23 | |
业务流程Business Process | ||
BPEL4WS (M) | 74 | |
配置文档pecification Profiles | ||
Devices Profile (O) | 24 | |
WS-I Basic Profile (O) | 50 | |
TOTAL PAGES: | 783 |
什么是REST?
RESTful的设计
WS-*与REST的比较
讨论
前瞻
REST为Web定义了一个架构风格
它的四个原则可以用HTTP协议来实现
创建(POST《-》)——创建一个子资源
读取(GET《-)——获取当前资源的状态
更新(PUT -》)—— 初始化或更新一个URI对应的资源状态
删除(DELETE)——清除一个资源(在一个URI失效之后)
例如:
http://tools.ietf.org/html/rfc3986
http——统一资源标识符方案(URI Scheme)
://tools.ietf.org——授权(Authority)通常是一个主机名
/html/rfc3986——路径(Path)
https://www.google.ch/search?q=rest&start=10#1
?q=rest&start=10——查询(Query)
#1——片段(Fragment)
GET /book?isbn=24&action=delete
DELETE /book/24
REST URI对于客户端透明的意思是它是由后续的链接提供,而不是通过客户端自行创建
注意:URI模板引入了客户端和服务端的耦合
关于REST实现的最佳实践有些区别(在本人实际工作中,很多技术实力雄厚的大型企业,对于REST最佳实践的方案也基本可以归为以下两种,而第一种“低级”REST比较普遍)
补充说明:
(*)有些防火墙或者HTTP的代理可能丢弃PUT/DELETE请求
(**)XML可以被RDF、JSON、YAML或者ATOM(ATOM存在很大的争议)替代
XML | JSON(JavaScript Object Notation) |
—PO-XML | 为AJAX Web应用引入格式供(浏览器-Web服务器通讯) |
—SOAP(WS-*) | |
—RSS,ATOM | |
半结构化的数据和标准的文本语法 | 文本语法支持序列化非循环的数据结构 |
工具:XML Schema,DOM,SAX,Xpath,XSLT,Xquery | 有很多语言支持(不仅仅JavaScript) |
每个人都可以解析它(不需要理解) | 不需要扩展 |
慢、臃肿 | JSON已经成为AJAX中的X而不是XML |
REST 的优与劣
优势(Strengths) | 劣势(Weakness) |
简单 —统一接口不可变更 |
混乱(区分high REST和low REST) |
HTTP/POX 无处不在 | 在前后台系统设计中存在不匹配的情况(异步消息和事件驱动) |
无状态/同步交互 | 除了HTTP/SSL不能实现其他的企业应用的风格(*) |
可扩展 | |
易于理解并采用(轻量级) —只需要一个浏览器,不需要WS中间件 |
对于合适的识别和定位所有应用中的资源时一个挑战 |
朴素的方法(grassroot approach) | 缺乏标准(本人认为REST是一个设计风格而非标准) |
被所有的Web2.0应用采用 —85%的客户都喜欢Amazon的RESTful API —Google不再支持SOAP/WSDL API |
语法和语义的描述是非正式的(面向用户的) (本人认为这也恰恰是一个优势) |
(*) 关于企业的应用风格(-ilities)参照文章http://www.cnblogs.com/richaaaard/articles/5006681.html
是否不能实现我们还有待探讨
更多的信息可以查看Doodle API: http://doodle.com/xsd1/RESTfulDoodle.pdf
(当然在RESTful下也有很多其他的API实现)
主要体现在HTTP的标准响应码上
对于GET、PUT、DELETE这些幂等操作,可以执行多次而不会对服务端的状态产生其他影响,可以在服务器宕机或者出现内部错误而恢复过后,重新发起这些请求。对于POST这种非幂等操作就需要在出现异常之后特殊处理,在有些场景下,它也可以被设计成幂等操作来实现:
B = GetBalance() // safe B = B + 200$ // local SetBalance(B) // safe
就是一个苹果和一个橘子的对比。一个是中间件互用性的标准,另一个是Web架构的风格。
—应用需要把它的信息通过URI发布到网络
—应用可以与网络交互,但是他们处于网络之外
REST | SOAP |
REST是基于人类可读的文档,它定义了请求的URI和响应(XML,JSON) | 客户端的stubs可以通过WSDL的描述用大多数语言生成 (实际上SOAP也是一种XML,也是可读的) |
需要大量的测试和调试,因为URI是手工创建的 (是否有相关工具) |
每个服务都根据自己的语法发布自己的接口 |
我们为什么需要强类型的消息? (如果客户端和服务端都很清楚传输的内容是什么) |
强类型 |
WADL | WSDL1.1(整个开放端口对于GET和POST是统一的) |
XML 足够了?(实际上有JSON、XML等其他) | WSDL2.0(更灵活,每个方法的GET or POST可选) |
REST | SOAP |
REST的安全就是HTTPs | SOAP的安全定义在WS-Security中 |
被证明的(SSL1.0 自1994) | XML加密 |
XML签名 | |
—彻底的互用性没有意义 | |
—性能? | |
点到点安全(认证、完整和加密) | 端到端安全,不需要HTTPs |
REST | SOAP |
显性的状态转换 | 隐性的状态转换 |
—通信是无状态的 | —服务端可以保持状态 |
—资源数据包含了有效的状态链接 | —消息只包含数据 |
—客户端根据链接来获取并维护状态 | —客户端根据服务端的状态机逻辑来维护自己的状态 |
Session技术 | Session技术 |
—Cookies(HTTP Headers) | —Session Headers(非标准) |
—URL Re-writing | |
—表格字段隐藏 |
异步可靠的消息
POST /queue 202 Accepted Location: /queue/message/1230213 ____________________________ GET /queue/message/1230213 DELETE /queue/message/1230213
REST | SOAP |
XML | O/XML 绑定 |
其他的方式JSON、YAML、RDF | |
XML Schema | 数据格式的契约需要和接口一起定义 |
HTTP | 尽管REST认为SOAP误用了POST |
松耦合可扩展 | SOAP提供同步异步方式 |
SOAP认为统一的接口不会改变 |
(然而市面上有些产品实际上可以支持他们的相兼容)
参考:
《SOA设计模式》 由Thomas Erl及其他供稿者合著,作为Thomas Erl关于面向服务计算丛书的一部分,于2009年1月由Prentice Hall出版,ISBN 0136135161,版权所有2009 SOA System Inc.。
Web Services and Service Oriented Architectures@2009 Cesare Pautasso