1992年网站(Web Sites)是在Web浏览器和Web服务器直接经过HTTP传输HTML。html
2000年WS-* (Web Services)是在客户端和服务器之间基于HTTP传输SOAP XML格式的数据,服务端用WSDL来规定契约。json
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)并发
什么是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认为统一的接口不会改变 |
(然而市面上有些产品实际上能够支持他们的相兼容)