转:WebService通用接口
看到许多中小项目的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通用接口的更多相关文章
- C#动态webservice调用接口 (JAVA,C#)
C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...
- 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步. 上一篇,我们明确了我们的"规范和约定". 从 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...
- SoapUI SoapUI测试WebService协议接口简介
SoapUI测试WebService协议接口简介 by:授客 QQ:1033553122 1. 创建项目,入口:File -> New SOAP Project,或者右键默认项目Project- ...
- (二)使用CXF开发WebService服务器端接口
CXF作为java领域主流的WebService实现框架,Java程序员有必要掌握它. CXF主页:http://cxf.apache.org/ 简介:百度百科 今天的话,主要是用CXF来开发下Web ...
- Atitit 通用接口的设计与实现attilax 总结
Atitit 通用接口的设计与实现attilax 总结 1.1. 现存的情况1 1.2. 接口返回类型,与返回序列化格式1 1.3. 异常传递 代替返回值模式1 1.4. 通用接口原理1 1.5. A ...
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
- PyNN:神经网络模拟器的通用接口
PyNN:神经网络模拟器的通用接口 计算神经科学已经产生了用于模拟神经元网络的多样化软件,同时具有消极和积极的后果.一方面,每个模拟器都使用自己的编程或配置语言,导致将模型从一个模拟器移植到另一个模拟 ...
- [转载]Linux驱动-SPI驱动 之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
随机推荐
- Redux教程1:环境搭建,初写Redux
如果将React比喻成士兵的话,你的程序还需要一位将军,去管理士兵(的状态),而Redux恰好是一位好将军,简单高效: 相比起React的学习曲线,Redux的稍微平坦一些:本系列教程,将以" ...
- [转]Java反射之如何判断类或变量、方法的修饰符(Modifier解析)
Java针对类.成员变量.方法,有很多修饰符,例如public.private.static.final.synchronized.abstract等,这些修饰符用来控制访问权限或其他特性. 本文就用 ...
- MFC -- 遍历Dialog中的子元素(控件)
CWnd *win = GetWindow(GW_CHILD);//获取第一个子控件 while(win) { win代表子控件,可以通过win来获取子控件的信息,如下述两行代码 //iCtrlId ...
- Jackson ObjectMapper类使用解析
/** * Jackson ObjectMapper类 */ //ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonPa ...
- range()和xrange()
range(): range([start,] stop[, step]) 如: range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] range()默认起始点为0 且ra ...
- 【转】silverlight telerik RadGridView 列头显示其他控件
<telerik:GridViewDataColumn DataMemberBinding="{Binding target_id}" IsFilterable=" ...
- Socket支持多用户并发访问的解决办法
//创建线程池,池中具有(cpu个数*50)条线程 ExecutorService executorService = Executors.newFixedThreadPool(Runtime.get ...
- iOS 修改backBarButtonItem 中的titile 字段
需求如下:A 页面 push 到 B 页面. B 页面中有个返回按钮 不显示A 中的title,而显示 "<返回" ,当然系统的样式还是默认的系统样式.(考虑都是nav ...
- display:inline-block 和float:left 的区别
display:inline-block 和float:left 的区别 display是指显示状态,float是针对块级元素的浮动. 使用inline-block:控制元素的垂直对齐跟横向排列元 ...
- 获取 view所在的VC
- (UIViewController*)viewController { for (UIView* next = [self superview]; next; next = next.superv ...