首页新闻找找看学习计划

Web Service接口设计规则的问题

1
[已解决问题] 解决于 2013-06-05 08:54

我在为本公司的一个项目开发一个供第三方访问的平台,用户要求提供的接口是Web Sercvice方式,考虑到接口方法可能会随着用户需求变更不断升级,并且要保持向后兼容,因此如何设计叫人很为难,目前有以下不同想法,但不知道哪种更好,或者大家有更好的方法:

1、整个平台只提供两个接口方法,参数与返回值都是XML格式字符串,一个写入信息writeObj(接口标识符,接口版本号,XML格式参数),一个读出信息readObj(接口标识符,接口版本号,XML格式参数),例如writeObj("addUser","1.0","<?xml version="1.0" encoding="GBK"?><userId>001</userId>....")。平台内部写一个业务识别层,根据接口标识符与接口版本号,实际调用相应业务方法,返回XML格式的字符串型返回值给调用者;这样接口升级,只是改动接口标识符或者版本号,调用方不作任何变动,不需要重新生成Web Service客户端桩代码;也可以将接口标识符与接口版本号作为XML格式参数的一部分,即只有一个参数writeObj("<?xml version="1.0" encoding="GBK"?><appId>addUser</appId><ver>1.0</ver><userId>001</userId>....");

2、平台提供多个接口,一种业务一个接口,接口内有各种方法,参数及返回值都是简单对象,不是字符串;如果接口升级,则在包内添加新的方法,可以在新方法名后加版本号区分老方法名,同时老的方法名保留,例如com.mycompany.webservice.userManage.addUser1(User user),com.mycompany.webservice.userManage.addUser2(User user);调用方如果跟随升级,则需要重新生成web service客户端桩代码;

3、平台提供多个接口,一种业务一个版本一个接口,接口内有各种方法,参数及返回值都是简单对象,不是字符串,如果接口升级,则重新创建一个新包,方法名不变,例如com.mycompany.webservice.userManage1.0.addUser(User user),com.mycompany.webservice.userManage2.0.addUser(User user);调用方如果跟随升级,则需要重新生成web service客户端桩代码;

mentat的主页 mentat | 菜鸟二级 | 园豆:329
提问于:2013-05-22 14:50
< >
分享
最佳答案
0

我有个想法:接口的方法名固定不变,升级后用户用不着重新生成客户端代码,但是不同版本的webservice方法发布到不同的地址(即提供不同的web服务地址),如版本1.0发布到:http://www.xxxx/webservices/v1/abc.asmx;版本2.2发布到http://www.xxxx/webservices/v2/abc.asmx。这样用户在客户端该配置文件(里面放webservice的地址)就可以了。他们想调哪个版本的就调按个版本的

奖励园豆:5
会长 | 大侠五级 |园豆:6035 | 2013-05-22 18:06

问题是产生不同版本的原因是方法中的数据传输对象发生了变更该如何办?例如,在user数据传输对象中加了一个新属性address,那还是得重新生成桩代码!在这种情况下,第一种方式的好处就是客户跟随升级时,只需要客户端在拼xml文档时加个<address>北京市xx小区yy号</address>并修改版本号为2.0即可。

mentat | 园豆:329 (菜鸟二级) | 2013-05-22 18:16

@mentat: 如果是这种变化,那升级后无论如何都得改代码了。呵呵,都新增属性了,客户端代码肯定得改了。以后的变化有什么规律没?能预知一些不?

会长 | 园豆:6035 (大侠五级) | 2013-05-23 09:48

@会长: 那肯定是都要改客户端代码的,但就是不好决定哪种方式对客户端维护工作量小、方便明了。看了一些给第三方调用的web service接口方案,包括移动新浪之类的大公司,一般都是上传、返回一个XML格式字符串,但觉得这样并不正规,完全不是SOAP的本意,没有发挥RPC的作用,还不如直接用写个aspx之类动态网页给别人算了,开销也小,拿回去你想怎么解释都行,因此觉得郁闷!

mentat | 园豆:329 (菜鸟二级) | 2013-05-24 09:19

@mentat: 要不问问客户,看他们想要什么样的

会长 | 园豆:6035 (大侠五级) | 2013-05-24 09:41

@会长: 不知道IBM之类公司在做SOA项目时用的是什么方式,有个参考就好了,就有信心了。客户有好几个不同公司,问也应当没有什么作用,要知众口难调,如果有个权威的公司的样例就好了。我比较倾向用严格的RPC接口规范,可找了几个大公司的全是“降级”版本的东东,心里有点七上八下,觉得对客户没有说服力呀!

mentat | 园豆:329 (菜鸟二级) | 2013-05-24 09:47

@mentat: 这么高深的问题我就不知道了,呵呵,再请教下高人吧。

会长 | 园豆:6035 (大侠五级) | 2013-05-24 09:50

@mentat: 你把问题悬赏分高一点,再去闪存里吼一嗓子,我先去吼去.....

会长 | 园豆:6035 (大侠五级) | 2013-05-24 09:53

@mentat: 我又有个想法:不用webservice这种方式了,把客户需要的数据以JSON的形式发布到网上,客户自己想要什么数据就用JS去获取(他们只要知道url就行)。我做过个微软的CRM二次开发,它就是这样的。楼主,你查查“json”,“odata”,“rest”关键字了解下看行不行。

会长 | 园豆:6035 (大侠五级) | 2013-05-24 11:24

@会长: 这方法是不错,很多网站也是这样做的,我还由此想过用web service上传、返回json格式数据,但总觉得严格的RPC+XML正式一点吧!业主是政府部门,不是发布天气商讯的网站!

mentat | 园豆:329 (菜鸟二级) | 2013-05-24 14:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册