动词 or 名词 :这是一个问题

前言:有网友让我用通俗的语言来讲一讲RESTful ,   我在这一块工程实践的不太多,有点为难了,  只能讲一讲我的理解, 欢迎大家批评指正。

计算机行业最擅长造新词了,像什么AJAX,IoC, AOP, SOA, NoSQL, 微服务,TDD,敏捷,RESTful......等等。


有很多人非常喜欢在口头拽这些热门名词,显得多么高深的样子,  其实这些热词背后代表的东西,要解决的问题没那么复杂,很多人是由于带着敬畏心被吓住了。


RESTful就是其中之一, 它不是一个新的计算机语言或者技术,  只是一个架构风格, 准确一点讲是如何设计系统来对外提供服务。 


传统网站

我在2000年左右还是微软粉丝,一直用ASP + COM 写Web网站, 当时的网站是单纯的HTML, 只有一点javascript效果, 这些网站基本上是自治的“独立王国”, 不会通过API接口对外提供服务。 


由于在浏览器中通过javascript来异步访问后端接口的极少,  AJAX这个热词还没有出现, 所以当时在ASP中主要处理两个东西:

0?wx_fmt=jpeg

图1 : 常见的网站操作

很普通,对吧? 其实现在大部分网站还是这么做的。 

SOA

后来互联网大发展, 各个网站系统变的越来越复杂,一个自治的“帝国”经常要被划分成多个“王国”,这些王国之间如何沟通和交流变得重要起来。


一些大厂商顺势制定了叫做SOA的标准,提出了面向服务的架构体系。


面向对象这样的技术术语不同 , SOA中的服务其实是业务层面的东西, 是个业务活动的逻辑表达方式,粒度更粗一些。


这些服务独立于厂商,产品和具体实现技术,  能够发布出来被别的系统调用, 还能够被组合起来形成更粗粒度的“服务”。


虽然服务是面向业务的, 但还得用具体的技术表达出来, 毫无意外, 大佬们选择了XML,   用XML来描述一个服务看起来来像这个样子:

0?wx_fmt=jpeg
图2: 服务描述片段


没有玩过Web Service 的不用完全看懂它,它描述的也是一个getBook这样的操作, 输入是一个id ,类型是字符串。


返回值也是一个字符串 (通常是XML格式的,表示书籍的详细信息)


我想突出的重点是这个服务(getBook)和 “图1"  中的getBook.action 在形式上的一致性:


他们都试图表达这样一个过程: 获得一本书的信息,  所以这两种方式都是面向过程的。

或者说,他们都以动词为主, getBook, addBook,  deleteBook , placeOrder,  registerUser,  login transfer 等等


RESTful

其实面向过程,以动词为主的方式是最自然的方式, 码农不用怎么费脑子就能想到如何设计。


然后RESTful 这种概念就漂洋过海,从美国杀入了中国市场。


RESTful告诉大家说: 以后你们不要用动词, 用名词更好, 不要面向过程了, 要面向资源(Resource)。 

资源使用一个URI来表达的, 例如 :

0?wx_fmt=jpeg

图3 : REST风格的资源


注意图3 中的books, orders, 这些都是名词,  那问题自然就来了: 我怎么做传统的add, delete等操作呢?


RESTful 说: 要充分利用HTTP 提供的方法:

0?wx_fmt=jpeg

图4: 对资源的操作


你看增删改查都齐全了。


需要注意的是服务器端返回信息的格式由发起调用的客户端指定,例如HTML ,JSON, XML, 这称为资源的表述(representation)


我第一次看到这种方式的时候大为震惊, 这实在是太不直观了。 


按照这种风格,你需要把服务器端的东西都 ”资源化“, 像上面的那些很容易, 还有一些例如转账登录忘记密码获取短信验证码,这样常见的业务操作“资源化”起来就不那么爽了。 


RESTful 架构风格还要求Stateless(无状态),  服务器端并不会维护/保存会话(session)信息,  这些会话信息应该有客户端来维持,每次请求时也需要一并发送到服务器端。 


服务器端甩掉了会话状态这个大包袱,一下子就轻松多了,可扩展性会有极大提升, 例如我可以把一个服务部署到由100个服务器组成的集群中,每个服务器都可以处理用户的请求。


假设用户第一个请求发到了服务器#87  ,然后这个服务器坏了, 第二次请求可以发送到剩下99个服务器中的任何一台, 反正会话信息包含在每个请求中, 任意一台服务器都能处理。 


我认为RESTful的无状态是一种理想的境界,现实中不大容易做到, 客户端到底如何保存session信息呢,是每次请求都把用户名/密码 发到服务器端还是通过第三方认证的方式实现?  


如果想实现一个购物车的应用, 服务器不保存session的话该怎么做?    我这块儿实践不多,请高手不吝赐教。


虽然有难度, 那为什么现在很多人对REST趋之若鹜呢?


我个人认为大家是看中了他的轻量级的风格, 那就是用HTTP+JSON就可以搞定一切。


传统的SOA倾向于用WSDL来描述服务, 用SOAP协议来访问服务,此外还有服务注册,发现, 组合,总线,安全等一系列问题, 通常还得上Websphere ,WebLogic 这样重量级的服务器。


码农不仅要问了: 我就想调用一个简单的接口, 搞这么麻烦干嘛?


REST一来, 写个Web服务简直是太简单了, 用一个最“低级”的java servlet, 分分钟搞定, 不过有时候大家也没有严格的遵循REST的要求, 没有把一切东西都“资源化”,因为那样太不容易了。


我看到的很多项目号称是REST风格, 但其实就是通过HTTP和JSON对外提供的服务而已 ,没有完整的遵循REST架构风格的约束, 可以说是“挂着REST的羊头,卖着面向过程的狗肉”。

最后,推荐大家去读一下RESTful架构风格的提出者Roy Fielding 博士的论文, 2000年发表的《架构风格与基于网络的软件架构设计》, 这是RESTful开山之作, 也是Web发展史上非常重要的一篇文献。

(完)


声明:原创文章,未经授权,禁止转载


你看到的只是冰山一角, 更多精彩文章,尽在“码农翻身” 微信公众号, 回复消息"m"或"目录" 查看更多文章


有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 14703250

我是一个线程

我是一个Java class

Javascript: 一个屌丝的逆袭

Java : 一个帝国的诞生

我是一个网卡

我是一个路由器

2016年春季互联网高端人才流动报告

TCP/IP 之 大明王朝的邮差

CPU 阿甘

Basic : 一个老兵的自述

小王的架构师之路

程序员在工作中必备的能力

码农需要知道的潜规则

IE为什么把Chrome和火狐打伤了

Node.js :我只需要一个店小二

假如我是计算机系老师

假如时光倒流,我会这么学Java

学会编程,而不是学会Java

15年编程生涯,资深架构师总结的7条经验


0?wx_fmt=jpeg

公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值