个人对SOAP/Web Service和REST/OData的一些想法
找了半天也没有合适的板块,最后还是决定发这里了,虽然估计也不大会有人气的样子:)
正文开始,模块化是程序开发的思想之一,即传入参数,传出结果,至于当中处理的过程调用者并不用关心。这种功能模块,以前叫函数,现在在面向对象里叫方法,当然也可以泛称为程序。
原本这些方法都是在同一个系统或开发环境里才能调用的,而Web Service的理念是通过网络让任意系统里的方法都可以被其他任意系统调用,比如我在我的项目里用.NET开发了一个方法,你可以在你的JAVA项目上调用我的方法,这种调用是跨平台和语言的。
想实现这种调用,需要的东西基本是被调用方的网址,类和方法的名字,接口参数等信息,然后按照一定的格式存放在XML里传输以供调用方解析,一般普遍都是通过HTTP的POST方法来传输这些数据。如果调用方是Web程序,那么直接写JS就可以了,如果调用方是客户端程序,那么先在客户端生成一个类,这个类的接口参数就是被调用方法的参数,这个类的“背后”应该是一个类似于代理服务器这种的平台,再通过POST方法和被调用方通信。
当然,如果是客户端程序调用的话,这种方法只是选择之一。主流开发语言都有基于TCP/IP的的类库,比如Socket,所以从实现技术角度讲,完全可以通过两个程序之间连通,而不用通过HTTP。只不过假如开发平台和语言不一样的话,可能会涉及到一些接口插件的问题,需要作额外的开发。
以上是我对Web Service(SOAP)的一些理解,接下来说下REST。看了不少资料,大多都说得比较抽象,我个人觉得SOAP和REST的主要区别在于实现功能的“主体程序”是存在于哪里的。假设现在有个服务器A(包括了数据库),A上有个程序X,程序X的作用为“根据输入参数取得数据并处理数据”,那么在SOAP的实现里,我在客户端通过HTTP的POST方法把需要的参数传过去,然后服务器A上运行程序X,在这个过程里,“主体程序”是存在于服务器A上的。在REST的方法里,通过OData技术,把内部的数据库暴露成“网络版”数据库,通过HTTP的GET方法取得数据,数据取回本地后进行处理,然后把处理结果通过HTTP的POST或者PUT方法修改服务器A数据库上的数据,可见程序处理这块是写在调用端的。
REST的好处是正确地利用了HTTP,因为HTTP是一个应用协议而不是数据传输协议,所以SOAP里利用HTTP的POST方法来传数据是一种偏离了本来设计目的的做法(这也是为什么SOAP也可以在其他协议比如SMTP上实现)。同时也可以看到REST是跟OData紧密联系的,如果不把数据库暴露出来使之可以通过HTTP的方法操作,REST也就没有存在的意义了。
REST的问题,首先我觉得在GET作为URL版的SELECT,功能上是肯定不如真正的SQL强大的,起码一些复杂的查询我不觉得能够用URL实现,而且GET似乎有长度限制,这个可能也是个问题。然后在很多场合下,我们是需要直接调用已经写好了的方法,而不是从数据库取数再自己重新写一遍方法,这种情况下就是只能用Web Service(SOAP)了。
我个人觉得打个比方的话,SOAP/Web Service是把网络资源看成是程序,而REST/OData是把网络资源看是数据库,作用不同,根据场合选择合适的设计模式。
另外想请教下,我是不是把REST理解得比较狭隘,把资源仅仅看成是数据。之前也有看到说把一个服务看成是资源的,这个比较难以理解,我觉得如果是那样的话,那REST会不会变成换了个名字的SOAP?由于本人不做B/S开发,对Web技术的了解也只停留在功能结构层面上,如果有想得不对的地方请不吝指出。