看到许多中小项目的webservice接口的源代码,不禁有个吐槽的冲动。除了会用CXF,Axis2等神级框架,其他的懒得动了,都是Ctrl+V,Ctrl+C,把其他模块的Request,Response贴过来。一旦增加某个特性,不得不在所有Request,Response遨游一遍。早知今日,何必当初呢。

写一个好的Weservice Interface,关键是要多多总结。除了有Request,Response之外,还有很多。总结如下有:

Request:webservice的输入。

Response:webservice输出。

DataRsponse:带结果集的webservice输出。

ResultData:结果集,不同的interface,其ResultData不一样。

ReslutInfo:描述调用请求成功或者失败的对象。

WebServiceTemplate:模板类,定义如何调用下层函数,如何处理异常错误的流程

ResultDataCallback:回调类,与template配合,适用【返回结果集】操作,比如【获取用户信息】,【下订单】

ResultCallback:回调类,与Template配置,适用于【不返回带结果集的接口,比如【修改用户名】

ResponseFactory:用来组装 webservice消息 的工厂类。

ResultInfoFactory:用来处理异常信息的 工厂类,这个一个接口,为它实现一个默认实例吧。

有了这些小弟们,任何webservice接口的定义都能轻易搞定,不信我举个例子给你,咱们以【加法】为例!

AddRequest:

public class AddRequest extends Request{

    private int add;
private int added; public int getAdd() {
return add;
}
public void setAdd(int add) {
this.add = add;
}
public int getAdded() {
return added;
}
public void setAdded(int added) {
this.added = added;
} }

AddResonse:

public class AddResponse extends DataResponse<AddResultData>{

    private AddResultData resultData;

    public AddResultData getResultData() {
return resultData;
} public void setResultData(AddResultData resultData) {
this.resultData = resultData;
} }

AddResultData:

public class AddResultData implements ResultData{

    private int sum;

    public AddResultData(int sum) {
super();
this.sum = sum;
} public AddResultData() {
super();
} public int getSum() {
return sum;
} public void setSum(int sum) {
this.sum = sum;
}
}

一个简单的webservice接口:

public class Soap {

    public AddResponse add(final AddRequest request){
return WebServiceTemplate.doResult(new ResultDataCallback<AddRequest,AddResponse,AddResultData>(){ public AddResultData done() throws Exception {
return new AddResultData(request.getAdd()+request.getAdded());
} public AddResponse getRsp() {
return new AddResponse();
} });
} }

一个简单的TestCase测试:

public class TestSoap {

    @Test
public void testAdd(){
AddRequest add = new AddRequest();
add.setAdd(1);
add.setAdded(2); Soap soap = new Soap();
AddResponse rsp =soap.add(add);
assertEquals(3,rsp.getResultData().getSum()); assertEquals("0",rsp.getResultInfo().getResultCode());
assertEquals("success",rsp.getResultInfo().getResultDesc());
} }

虽然这些很简单,但是能够解决80%的问题。剩下20%还要根据实际情况来定。况且,这些代码在你的手中还有持续改优化的空间。千万不要做一个爱Copy的孩子。

转:WebService通用接口的更多相关文章

  1. C#动态webservice调用接口 (JAVA,C#)

    C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...

  2. 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现

        最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.     有点挑战,做完了,会有很大进步. 上一篇,我们明确了我们的"规范和约定". 从 ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明

    一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...

  4. SoapUI SoapUI测试WebService协议接口简介

    SoapUI测试WebService协议接口简介 by:授客 QQ:1033553122 1. 创建项目,入口:File -> New SOAP Project,或者右键默认项目Project- ...

  5. (二)使用CXF开发WebService服务器端接口

    CXF作为java领域主流的WebService实现框架,Java程序员有必要掌握它. CXF主页:http://cxf.apache.org/ 简介:百度百科 今天的话,主要是用CXF来开发下Web ...

  6. Atitit 通用接口的设计与实现attilax 总结

    Atitit 通用接口的设计与实现attilax 总结 1.1. 现存的情况1 1.2. 接口返回类型,与返回序列化格式1 1.3. 异常传递 代替返回值模式1 1.4. 通用接口原理1 1.5. A ...

  7. Linux SPI总线和设备驱动架构之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

  8. PyNN:神经网络模拟器的通用接口

    PyNN:神经网络模拟器的通用接口 计算神经科学已经产生了用于模拟神经元网络的多样化软件,同时具有消极和积极的后果.一方面,每个模拟器都使用自己的编程或配置语言,导致将模型从一个模拟器移植到另一个模拟 ...

  9. [转载]Linux驱动-SPI驱动 之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

随机推荐

  1. 修改(table的section与上一个section的间距)section header背景颜色

    - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView * ...

  2. iOS---XMPP环境搭建过程

    什么是即时通信? 即时通信是目前Internet上最为流行的通讯方式, 各种各样的即时通讯软件也层出不穷, 服务提供商也提供了越来越枫木的通讯服务功能. 即时通讯有多重实现方式, XMPP就是其中一种 ...

  3. iOS架构师之路:慎用继承

    最近在看大神Casa的文章<跳出面向对象思想(一) 继承>,脑洞大开.文章给我们展示了一个随着产品需求不断变化的例子,该例子中通过继承实现不同页面的搜索视图和搜索逻辑的代码复用,随着产品需 ...

  4. angularjs的简单应用(一)

    AngularJS是为了克服html在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了. AngularJS使用了不同的方法,它尝试去 ...

  5. 北大poj-1011

    木棒 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 136132   Accepted: 32036 Description ...

  6. ThinkPHP学习遇到的点问题(学习中,持续更新)

    1.__ROOT__变量没有值的问题 今天遇到这个比较变态的问题,可能是我技术比较菜吧,搞了一个多小时,最后发现问题可能出现在 入口文件中定义的APP_NAME的名字和项目的跟目录名称相同了,比如我网 ...

  7. c++11新的小猫腻

    1.void*指针的使用,平时见得也很多了,至于为什么使用void* 指针,很多人有自己的见解,反正普通指针轻轻松松的转向void * 指针,但是void*指针转向其他的指针都要采用强制转换的. 2. ...

  8. 软件测试第二次作业——Fault,Failure,Error辨析与设计测试用例

    Fault 静态错误 ,Failure 外部错误 ,Error 内部错误 问题答案 第一题 1.1 当数组x内的元素≥2时,该循环不会检测到x[0]这个元素. 1.2 test: x=[2, 3, 2 ...

  9. js 自运行函数作用

    var obj = new Object(); function test2() { for (var i=1;i<5;i++) { obj['f'+i] = function() { retu ...

  10. Html 之div+css布局之css选择器

    CSS选择器 什么叫选择器?通俗的来说就是 我想改变html 中某个地方的  字体大小 或者背景色 或者其它属性 内边距 外边距,宽度高度 等等 一些Css 样式. 那么我们如何找到对应的 元素呢? ...