我反对RESTfulhtml
并非说RESTful彻底错误,只是不同意它的理念。前端
我的观点,不喜勿喷!学识有限,浅谈辄止!git
首先,看个小程序。对于下面这个类,咱们如今指望pid只读。github
class User { private String name;//姓名 private String pid;//身份证号 ... public User(String newName,String newPid) { name = newName; pid = newPid; } }
方法一:增长getterweb
public String getPid() { return pid; }
方法二:同时增长getter/setter小程序
public void setPid(String newPid) { throw new Exception("Sorry!不让改!"); } public String getPid() { return pid; }
不知你们采用哪一种??安全
再举个例子,若是你有一间房子,你永远不打算从南面走出去。那么,你是在南边装扇门并永远锁上,仍是干脆不在南墙上装门?服务器
其实我想说的是————对于一个系统(或干脆就指一台服务器)而言,对外提供的应该是‘通过包装的有限服务’,而不能把全部资源全盘托出,让使用者自选操做。网络
HTTP做为网络协议,它的设计目标是处理静态资源(从最先的纯html页面,到后来普遍支持各类文件),随着web应用的需求愈来愈复杂,出现了动态网站,而动态资源仍然是由应用服务器生成静态资源经HTTP协议转发的。架构
原来的web服务器,直接基于OS和文件系统操做静态资源,于是使用GET/POST/DELETE/PUT来表示对资源的操做;而应用服务器,至关于前端逻辑与数据资源的中间件,对资源的处理是应用程序的工做,CRUD是接口内部实现中考虑的问题,应当保持在应用程序内部。
接口的设计应只考虑当前业务功能是什么(报名/下单/改签/..),一项具体的业务需求是一个短语或一句话,深层次已经包含了目标资源和对应操做,请求业务时无需再额外描述“增删改查”的概念。因为系统服务的包装性,资源不可直接外露,因此API中URI的实际做用应该是USI(Uniform Service Identifier)。
####RESTful的问题就在于,它是面向资源的,而不是面向服务的。
诚然,RESTful只是一种风格,并无改变程序功能。是否使用RESTful,最终实现的逻辑可能彻底一致;但从系统设计角度看,形式化的东西也很重要。
###————————————————————
退一步讲,姑且不说上面的问题,RESTful自己也是先天不足的————由于HTTP在web应用方面是先天不足的,而且HTTP的设计比较简单,其报头主要用于描述HTTP通讯参数和状态,而RESTful使用HTTP动词和状态码来表示业务逻辑,没法避免语义冲突和表达能力弱的问题。
冲突是由于:前端收到的状态码,多是HTTP协议直接返回的,也多是应用逻辑返回的。咱们作过一个项目,经理要求必须用HTTP状态表示业务请求结果。我极力反对,但不被采纳。结果:404被用来表示“您查询的××不存在”,而Server宕机或接口不匹配时,APP收到的结果也是这个;405/407/410直接被HttpURLConnection抛IOException。 而且标准状态码那么少,遇到复杂些的项目,也不够用啊。固然,能够自定义状态码,可是业务逻辑侵入网络协议毫不是一个好办法。仍是使用自定义Header或自定义消息格式靠谱,虽然使用头部字段也触碰了HTTP协议,但自定义头原本就是留给应用做扩展的,并不会干扰协议工做)
还看到有人提出RESTful最好实现Hypermedia API(http://my.oschina.net/u/2337119/blog/532450) ————这也不是一个好点子。一个系统应当严控业务接口的开放程度,API应提早绑定在远端。若是“你”不知道“我”这里有哪些服务可用,那么“你”就不该该来访问“我”,由于这样的“你”应该不是一个正常的访问者,不然,“你”应当知道系统服务列表,并确切地知道每一项业务对应的具体API。上文中和github的API做比较,是错误的。Github是开放平台,原本就是面向开发者、方便开发者的,API自己就是开发者须要查询的信息,需另当别论。
可能有人会说,API的调用者实际上是系统框架内的远端APP、页面或软件,RESTful使用HTTPS能够实现安全通讯,至关于这样的API是工做在系统内部,资源直接可见不成问题。对此,我也是反对的。曾经的DES很安全,后来不行了;曾经咱们觉得MD5没问题,后来也被质疑了;如今SSL也已滴过血了,尽管暂时还算安全,谁知道哪天就挂了......绝对的网络安全是不存在的;而且SSL实现的是通讯安全,不会保证远端的应用没有被绑架。一个可靠的、健壮的系统,不能把自身的安全彻底寄托在第三方身上,必需要以本身为主,该采起的策略和措施同样不能少。
RESTful的诞生源于:开发人员但愿Web service和app开发的基础架构和部分通用逻辑可以标准化。这个愿望并无错,但我认为人们在HTTP协议上打算盘倒是错误的。这只能是对上述指望的一次尝试,一次使用现有工具“将就着”实现理想中新工具功能的尝试。RESTful可否最终标准化,未来应该会有正式的、完善的新协议来取代RESTful以及HTTP,或许就叫作WASP吧。 [Web Application Service Protocol]