前言

Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
Spring+SpringMVC+MyBatis+easyUI整合进阶篇(四)RESTful API实战笔记(前端代码修改)

前文中提到了RESTful设计,后端实战及前端代码的修改,写完之后本来想写一下对RESTful的一些看法的,但是写着写着跑题了,最终是写成了不同阶段对于RESTful的认识和感受,包括第一次听到这个概念,第一次使用这个规范.....一幕幕回想起来也是很有意思的经历。

初识RESTful

第一次知道这个概念应该是在2014年的时候吧,那时候的我入行不久,接触JavaWeb开发也只是在入门的水平,做过几个小的官网项目,开发模式也是跟着公司的开发来,用比较传统的MVC开发模式,技术选型就是Jsp+Servlet,因此对REST这种思想或者说对于异步调用接口的方式可以说是一窍不通。

看着REST风格的接口URL,当时唯一的想法就是,不就是把".do"去掉吗?有什么难的?等等,如果把".do"去掉还怎么拦截Servlet的请求?

这就是初识RESTful的情形,第一次接触RESTful的时候,我的关注点在URL和Servlet拦截配置上,以那时的技术水平和开发经验来说,似乎也只能意识到这么多,对于RESTful的理解也仅仅在URL的格式不同罢了,至于其他的理解和想法?不存在的。

第一次在项目开发中结合REST实践

渐渐地,随着项目经验的增多,以及自学了一些Java中流行的开发框架,慢慢的就不再选择使用Jsp+Servlet来开发新项目了,在项目积累中也学到了关于异步调用的知识,学会了使用ajax异步调用接口渲染页面,这个时候还是没有想过接口的RESTful化。

第一次试着将RESTful运用到项目开发中是在挺久之后了,一位新同事在看了以往的代码后,提出想要改动代码,相对来说他更加有开发经验,因此就跟着他开始做代码修改的工作,那时候嘴巴里也整体RESTful来,RESTful去的,其实嘛,也不是很懂,这是真心话,只是听着老师傅说这么做是去优化代码的,作为菜鸟的我一听到项目优化,肯定是乐意去做的。

这是当时的指导文档,只截了一部分:

项目完成后,改动其实挺多的,配置文件,代码风格...不过这些都是代码层面的,暴露出的比较明显的变化就是接口URL的改变,接口中的".do"、".action"没了,调用时也增加了调用方法,与之前相比,逼格好像提高了一些!这是当时印象最深刻的感觉了。

但是依然有很多比较搞笑的地方,因为是第一次使用,很多概念其实也不是特别了解,http动词啊,状态码啊,包括REST其实是四个单词首字母的组合我都不知道,反正第一次使用完全就是个愣头青,依着葫芦画瓢,但是也并没有画的很像。

存在的问题很多:

  • uri不规范,url命名比较随便
  • 不理解http动词,post和get方法乱用
  • 没有错误处理
  • 也没有跨域处理
    .....

回忆起这次经历,总结起来就是画虎不成,不懂装懂,完全是图个新鲜。不过没有这次啼笑皆非的经历我也不会去学习这方面的知识,也算是迈出了第一步吧,虽然样子比较难看。

RESTful+前后端分离是一个良好的开发实践

真正大规模使用和深入学习是在一次项目的重构工作中,由于当时的开发人员配置还算可以,就计划将项目拆解为前后端分离的模式,对于开发人员的分工和代码结构都打算做一次大的改变。一开始依然是懵懵懂懂,随着学习和使用的深入,也不断的对之加深了解,对其中的一些知识点和规范也有了自己的看法,比如接口命名,http动词的使用,接口的版本控制,权限验证....

由于对RESTful的真正了解是在一次项目的前后端分离实践中,因此对REST的认识都多多少少的带有一些前后端分离的想法,并不是说REST一定要和前后端分离这个概念产生必然的联系,REST用在普通MVC项目中可以吗?是可以的,前后端分离的项目中调用的接口不符合REST规范可以吗?也是可以的。其实,REST+前后端分离是一个相对来说不错的一个开发实践,对前后端的开发人员都比较友好,当然,这都是个人想法,在实际工作中也是受到了较大的影响,后来的大部分项目开发也基本上都是遵循这种方式,除非有特殊情况。

不仅仅只有RESTful

在网站或者应用的开发中,数据传输方式不仅仅只有RESTful一种规范,比如传统的MVC模式的开发模式中,就是将数据放入model中来实现数据的传输,当然,这种方式不是基于接口的方式,基于接口的调用还有webservice方式,我没有接触过webservice开发就不多讲了,至于其他的还有基于RPC框架的调用方式。

在服务化的讨论中目前最风光的应该就是SpringCloud和微服务了吧,由于在SpringCloud技术栈中,各个微服务间调用的方式就是http+json方式,可以很简单的设计为RESTful架构,因此RESTful概念也随之又变得火热和流行起来。

说到这里呢,又引出了一个比较,就是在项目服务化过程中,是选择使用阿里开源的Dubbo还是Netflix开源的SpringCloud技术栈呢?

为什么提出这个问题呢,因为这两个技术栈恰好是分别使用了基于http+二进制序列化的RESTful规范(SpringCloud)和基于tcp+二进制序列化的RPC调用方式(Dubbo),Dubbo是国内较为流行的服务化框架,资历也较老,而SpringCloud则是目前炽手可热的后起之秀,关于这二者的比较怕是可以写出不知多少篇文章了,在这里提到二者之间的比较也是想说明技术选型其实不用拘泥于一种。

REST只是众多方式中的一种罢了,方法和技术选型真的很多,因此不要标榜其中任何一种方式,也不要鼓吹其中任何一种技术,没必要,选择适合你的就好,如果实在不知怎么选,干脆都用一下就好了。

结语

首发于我的个人博客,新的项目演示地址:perfect-ssm,登录账号:admin,密码:123456

如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友,本篇主要讲述了个人对于RESTful的理解。

如果你想继续了解该项目可以查看整个系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub仓库或者开源中国代码仓库中查看源码及项目文档。

记录一下从懵懂到理解RESTful的过程的更多相关文章

  1. CMDB资产管理系统开发【day27】:理解RESTful架构

    理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hig ...

  2. 理解RESTful 架构

    REST是所有Web应用都应该遵守的架构设计指导原则. Representational State Transfer,翻译是”表现层状态转化”. 面向资源是REST最明显的特征,对于同一个资源的一组 ...

  3. 理解restful 架构 && RESTful API设计指南

    restful是前端和后端接口中都会使用的设计思想. 网站即软件,我们也常说的webapp,这种互联网软件采用的是“客户端/服务器”模式,建立在分布式体系上. 网站开发,也可以完全采用软件开发的模式, ...

  4. 我是如何根据豆瓣api来理解Restful API设计的

    1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思.它是在Roy Fielding博士论文首次提出.REST本身没有创造新的技术.组件 ...

  5. 理解RESTful架构——Restful API设计指南

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

  6. 理解RESTful架构

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  7. [转]理解RESTful架构

    原文地址:http://www.ruanyifeng.com/blog/2011/09/restful 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件" ...

  8. 理解RESTful架构(转载)

    本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...

  9. [转载] 理解RESTful架构

    原文: http://www.ruanyifeng.com/blog/2011/09/restful.html 理解RESTful架构   作者: 阮一峰 日期: 2011年9月12日 越来越多的人开 ...

随机推荐

  1. 通过日期在js中求出判断间隔天数,周期等实现分享

    在我们在项目的时候,可能出现这样的一种情况,有一个开始时间和一个结束时间,而这两个时间用$('#StartTime').val(); 取出来的时候又是datetime 类型,我们需要求这个时间中的间隔 ...

  2. JDK源码阅读——ArrayList

    序 如同C语言中字符数组向String过渡一样,作为面向对象语言,自然而然的出现了由Object[]数据形成的集合.本文从JDK源码出发简单探讨一下ArrayList的几个重要方法. Fields / ...

  3. Wireshark使用drcom_2011.lua插件协助分析drcom协议

    drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lu ...

  4. Django视图,与数据库交互并返回数据

    环境:python 2.7.13  数据库:sqlite3(Django自带) 在学习Django的时候,遇到了困难.大概就是取到数据库数据后一直不能转成json数据.最后终于自己琢磨解决了. 要点就 ...

  5. linux中文件I/O操作(系统I/O)

    我们都知道linux下所有设备都是以文件存在的,所以当我们需要用到这些设备的时候,首先就需要打开它们,下面我们来详细了解一下文件I/O操作. 用到的文件I/O有以下几个操作:打开文件.读文件.写文件. ...

  6. C-C++到底支不支持VLA以及两种语言中const的区别

    C-C++到底支不支持VLA以及两种语言中const的区别 到底支不支持VLA VLA就是variable-length array,也就是变长数组. 最近写程序的时候无意间发现,gcc中竟然支持下面 ...

  7. Httpservlet 获取json对象字符窜

    使用的是google 的json转换jar import com.google.gson.JsonObject;import com.google.gson.JsonParser; import or ...

  8. setTimeout,setInterval你不知道的事

    javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...

  9. Bitbucket 触发内网 Jenkins Build

    为了保证安全性多数的持续集成系统都会部署在公司内部的局域网中,这样如果代码部署在 Bitbucket 等环境中就只能通过轮询的方式来触发 Build.那么有没有办法通过 Bitbucket 的 Web ...

  10. Java: server/client 心跳机制实现 示例

    心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...