目 录
2.3检查ecology web service是否已部署 5
一、前言
1.1编写目的
本文给有研发能力的客户或有系统集成需求的客户提供web service接口调用的参考例程。本文的面向具有一定web service开发能力或了解web service技术的开发人员。
1.2名词定义
1、Axis:
著名的开源web service引擎。
2、Xfire:
是codeHaus组织提供的一个java web service开源引擎。
3、外部系统:
指调用或实现e-cology工作流输入输出接口,与e-cology系统进行数据交接的其他系统。
二、接口调用步骤
2.1 Ecology系统流程接口部署
修改/WEB-INF/web.xml文件
在相应处增加servlet部署(参考系统中已有很多servlet部署),加入如下描述
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
注意:不要添加在注释中(即以“<!—”开始至“–>”结束为注释)!
2.2表单字段
在确定调用web service接口之前需要在ecology系统中设计好表单, 记下表单字段名(主字段和明细字段),在调用接口的时候需要用到。字段名在‘工作流程->表单管理->编辑字段’菜单中可以查到,如下图所示为留言表单的字段列表:
2.3检查ecology web service是否已部署
在浏览器中输入http://ecologyServer/services,应显示如下页面:
点击RequestService后面的wsdl链接应出现如下页面:
wsdl具体描述文件如下:
如果未出先上述页面,则web service未部署成功,请与泛微项目人员联系。
2.4接口方法概述
Web services服务名称 | 流程相关服务 | ||
Web services 服务地址 | http://ecology7服务器地址/services/RequestService?wsdl | ||
名称 | 参数 | 返回值 | 功能描述 |
createRequest | RequestInfo requestinfo:
请求信息对象 |
String:新流程的requestid
如果小于0表示失败 -1:创建流程失败 -2:用户没有流程创建权限 -3:创建流程基本信息失败 -4:保存表单主表信息失败 -5:更新紧急程度失败 -6:流程操作者失败 -7:流转至下一节点失败 -8:节点附加操作失败 |
根据请求信息对象创建一条新的流程 |
deleteRequest | int creatorId:
创建人id (大于0时该条件有效) |
Boolean:
True 成功 False 失败 |
根据参数删除流程请求信息 |
getMyRequestBySearch | int creatorId:
创建人id (大于0时该条件有效) String createStartDate: 创建日期(起)日期格式“YYYY-MM-DD” (不为空时该条件有效) String createEndDate: 创建日期(止)日期格式“YYYY-MM-DD” (不为空时该条件有效) String workflowid: 工作流id 多个用逗号分隔 (不为空时该条件有效) |
RequestBase[]:请求基本信息列表 | 根据参数条件获取我的请求列表 |
getPendingRequestBySearch | int userId:
用户id (大于0时该条件有效) String createStartDate: 创建日期(起)日期格式“YYYY-MM-DD” (不为空时该条件有效) String createEndDate: 创建日期(止)日期格式“YYYY-MM-DD” (不为空时该条件有效) String workflowid: 工作流id 多个用逗号分隔 (不为空时该条件有效) |
RequestBase[]:请求基本信息列表 | 根据参数条件获取代办事宜列表 |
getHendledRequestBySearch | int userId:
用户id (大于0时该条件有效) String createStartDate: 创建日期(起)日期格式“YYYY-MM-DD” (不为空时该条件有效) String createEndDate: 创建日期(止)日期格式“YYYY-MM-DD” (不为空时该条件有效) String workflowid: 工作流id 多个用逗号分隔 (不为空时该条件有效) |
RequestBase[]:请求基本信息列表 | 根据参数条件获取已办事宜列表 |
getProcessedRequestBySearch | int userId:
用户id (大于0时该条件有效) String createStartDate: 创建日期(起)日期格式“YYYY-MM-DD” (不为空时该条件有效) String createEndDate: 创建日期(止)日期格式“YYYY-MM-DD” (不为空时该条件有效) String workflowid: 工作流id 多个用逗号分隔 (不为空时该条件有效) |
RequestBase[]:请求基本信息列表 | 根据参数条件获取归档事宜列表 |
getRequest | int requestId:
请求requestid |
RequestInfo:
请求信息对象 |
根据流程requestid获得表单数据 |
getRequest | RequestManager requestManager:
requestManager对象 |
RequestInfo:
请求信息对象 |
根据requestmanager对象获取表单数据 |
nextNodeBySubmit | RequestInfo request:
请求信息对象 int requestid: 请求id int userid: 提交人ID String remark: 提交意见 |
Boolean:
True 成功 False 失败 |
流程提交 |
nextNodeByReject | int requestid:
请求id int userid: 提交人ID String remark: 退回意见 |
Boolean:
True 成功 False 失败 |
流程退回 |
forwardFlow | int requestid:
请求id int forwardoperator: 转发人id String recipients: 接收人id 多个用逗号分隔 String remark: 转发意见 String clientip: 客户端ip地址 |
Boolean:
True 成功 False 失败 |
流程转发 |
2.5 流程相关对象说明
1)RequestInfo
/**
* 工作流id
*/
private java.lang.String _workflowid;
/**
* 请求id
*/
private java.lang.String _requestid;
/**
* 创建者id
*/
private java.lang.String _creatorid;
/**
* 请求标题
*/
private java.lang.String _description;
/**
* 紧急程度
*/
private java.lang.String _requestlevel;
/**
* 提醒类型
*/
private java.lang.String _remindtype;
/**
* Field _hostid
*/
private java.lang.String _hostid;
/**
* 最后操作者
*/
private java.lang.String _lastoperator;
/**
* 表单主表信息
*/
private weaver.soa.workflow.request.MainTableInfo _mainTableInfo;
/**
* 表单明细表信息
*/
private weaver.soa.workflow.request.DetailTableInfo _detailTableInfo;
/**
* 流转日志
*/
private weaver.soa.workflow.request.RequestLog _requestLog;
/**
* 流程流转控制对象
*/
private weaver.workflow.request.RequestManager _RequestManager;
/**
* 创建流程是否自动流转至下一节点
* 0:不自动流程
* 其它:自动流程
*/
private java.lang.String _isNextFlow;
2)RequestBase
/**
*请求id
*/
private String requestId;
/**
*当前节点id
*/
private String currentNodeId;
/**
*流程id
*/
private String workflowId;
/**
*当前节点类型 3为归档
*/
private String currentNodeType;//归档:3
/**
*请求名称
*/
private String requestName;
/**
*创建人
*/
private String creater;
/**
*创建人类型 0:内部用户 1:外部用户
*/
private String creatertype;
/**
*最后操作者
*/
private String lastOperator;
/**
*最后操作者类型 0:内部用户 1:外部用户
*/
private String lastOperatortype;
/**
*创建时间
*/
private String createTime;
/**
*最后操作时间
*/
private String lastOperateTime;
3)RequestManager
/**
*请求id
*/
private int requestid = 0;
/**
*工作流id
*/
private int workflowid = 0;
/**
*工作流类型
*/
private String workflowtype = “”;
/**
*是否是批注提交 1: 是
*/
private int isremark = 0;
/**
*表单或者单据的id
*/
private int formid = 0;
/**
*是否单据 0:否 1:是
*/
private int isbill = 0;
/**
*如果是单据,对应的单据表的id
*/
private int billid = 0;
/**
*节点id
*/
private int nodeid = 0;
/**
*节点类型 0:创建 1:审批 2:实现 3:归档
*/
private String nodetype = “”;
/**
*请求名称
*/
private String requestname = “”;
/**
*请求的编号
*/
private String requestmark = “”;
/**
*请求重要级别 0:正常 1:重要 2:紧急
*/
private String requestlevel = “”;
/**
*签字批注
*/
private String remark = “”;
/**
*短信提醒类型
*/
private String messageType=””;
/**
*操作人是否需要流程反馈
*/
private String needwfback=””;
/**
*下一个节点的id
*/
private int nextnodeid = 0;
/**
*下一个节点的类型
*/
private String nextnodetype = “”;
/**
*最后节点的id
*/
private int lastnodeid = 0;
/**
*最后节点的类型
*/
private String lastnodetype = “”;
/**
*出口名称
*/
private String status = “”;
/**
*请求创建者
*/
private int creater = 0;
/**
*创建者类型 0:内部 1:外部
*/
private int creatertype = 0;
/**
*请求创建日期
*/
private String createdate = “”;
/**
*创建时间
*/
private String createtime = “”;
/**
*最后操作者
*/
private int lastoperator = 0;
/**
*最后节点的操作者类型 0:内部 1:外部
*/
private int lastoperatortype = 0;
/**
*最后操作日期
*/
private String lastoperatedate = “”;
/**
*最后操作时间
*/
private String lastoperatetime = “”;
/**
*用户对象
*/
private User user;
2.6 生成客户端
大家知道,在本地调用web service,最便利的方法是利用工具生成客户端代理,开发人员通过客户端代理去访问web service将会非常简单,就象调用本地的方法一样。各大主流的编程语言都提供了通过wsdl生成客户端代理的工具,如c#中的wsdl.exe和java中的wsdl2java。本文以java为例说明客户端的生成方法。
2.6.1客户端所需jar
commons-discovery-0.2.jar
javax-wsdl_1.5.1jar
commons-logging_1.0.4.jar
axis.jar
jaxrpc.jar
saaj.jar
activation.jar
mail.jar
2.6.2 生成客户端
使用eclipse向导生成Web Service客户端
三、示例程序
本节介绍怎样利用生成的客户端代理访问ecology工作流, 提供了在外部创建带附件的留言、查询留言、创建多明细表单的示例代码。
3.1创建带附件的留言
在创建留言前我们需要知道留言流程在ecology系统中的workflowid以及留言表单的字段定义。获取字段定义的方法意见在前面的章节介绍过了,获取workflowid的方法如图所示:
工作流程->路径设置
可以看出留言表单的workflowid=5
3.2 使用客户端代理创建留言
代码:
/**
* 创建留言的示例代码
* @throws Exception
*/
public String testCreateRequest() throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if (jre.getLinkedCause() != null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
weaver.soa.workflow.request.client.RequestInfo ri = new weaver.soa.workflow.request.client.RequestInfo();
ri.setCreatorid(“57”);//表单创建人id
ri.setWorkflowid(“37”);//workflowid
ri.setRequestlevel(“0”);//紧急程度
ri.setRemindtype(“0”);//提醒类型
//添加主表数据
weaver.soa.workflow.request.client.MainTableInfo mti = new weaver.soa.workflow.request.client.MainTableInfo();
//设置主表个字段数据
Property[] p = new Property[3];
p[0] = new Property();
p[0].setName(“resource1”);
p[0].setValue(“57”);
p[1] = new Property();
p[1].setName(“department”);
p[1].setValue(“7”);
p[2] = new Property();
p[2].setName(“desc1”);
p[2].setValue(“测试多明细”);
p[3] = new Property();
p[3].setName(“fujian”);//附件字段
p[3].setType(“http:测试.txt”);//附件文件名,格式http:文件名
p[3].setValue(“http://xxx/xxx/download”);//附件网址,ecology工作流接口从此处获取文件并保存到ecology系统中。目前仅支持以http链接的方式上传附件。
mti.setProperty(new ArrayOfProperty(p));
ri.setMainTableInfo(mti);
//添加明细表数据
DetailTableInfo dti = new DetailTableInfo();
//本例中有两个明细表
DetailTable[] dt = new DetailTable[2];
//添加第一个明细表
dt[0] = new DetailTable();
dt[0].setId(“0”);//tableid is required
//添加一行到第一个明细表
Row[] r = new Row[1];
r[0].setId(“0”); //rowid is required
//添加单元格到行
Cell[] c = new Cell[2];
c[0] = new Cell();
c[0].setName(“dscone”);
c[0].setValue(“this is a cell”);
c[1] = new Cell();
c[1].setName(“int”);
c[1].setValue(“100”);
r[0].setCell(new ArrayOfCell(c));
dt[0].setRow(new ArrayOfRow(r));
//第一个明细表添加完毕
//添加第二个明细表
dt[1] = new DetailTable();
dt[1].setId(“1”);//tableid is required
//添加行到第二个明细表
Row[] dt1_r = new Row[1];
dt1_r[0].setId(“0”); //rowid is required
//添加单元个到行
Cell[] dt1_c = new Cell[1];
dt1_c[0].setName(“sec”);
dt1_c[0].setValue(“2”);
dt1_r[0].setCell(new ArrayOfCell(dt1_c));
dt[1].setRow(new ArrayOfRow(dt1_r));
//添加第二个明细表
dti.setDetailTable(new ArrayOfDetailTable(dt));
ri.setDetailTableInfo(dti);
ri.setDescription(“多明细表单”);
return binding.createRequest(ri);
// TBD – validate results
}
以上代码将在ecology系统中创建一个留言表单,并返回表单id供以后查询使用。
看看ecology中发生了什么?
3.3 使用客户端实现流程删除
/**
* 删除请求信息的示例代码
* requestid请求id
* @throws Exception
*/
public weaver.soa.workflow.request.client.RequestInfo deleteRequestById(int requestid) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
return binding.deleteRequest(requestid);
// TBD – validate results
}
3.4 使用客户端查询留言
/**
* 获取请求信息的示例代码
* requestid请求id
* @throws Exception
*/
public weaver.soa.workflow.request.client.RequestInfo GetRequestById(int requestid) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
return binding.getRequest(requestid);
// TBD – validate results
}
3.5 使用客户端实现流程转发
/**
* 流程转发
* requestid请求id
* forwardoperator 转发人id
* recipients 接收人id,多个用逗号分隔
*remark 签字意见
*clientip客户端IP
* @throws Exception
*/
public boolean ForwardFlow(int requestid, int forwardoperator, String recipients, String remark, String clientip) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
boolean value = false;
return binding.forwardFlow( requestid, forwardoperator, recipients, remark, clientip);
// TBD – validate results
}
3.6 使用客户端实现流程提交
/**
* 流程提交
* RequestInfo 主表明细表数据信息
* requestid请求id
* userid处理人
*remark 签字意见
* @throws Exception
*/
public boolean NextNodeBySubmit(weaver.soa.workflow.request.client.RequestInfo request,int requestid,int userid,String remark) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
boolean value = false;
return binding.nextNodeBySubmit( request , requestid, userid, remark);
// TBD – validate results
}
3.7 使用客户端实现流程退回
/**
* 流程退回
* requested 请求id
* userid处理人
*remark 签字意见
* @throws Exception
*/
public boolean NextNodeByReject(int requestid,int userid,String remark) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
boolean value = false;
return binding.nextNodeByReject(requestid,userid,remark);
// TBD – validate results
}
3.8 使用客户端获得待办列表
/**
* 流程待办列表
* creatorId创建人id
* createStartDate创建日期(起)
* createEndDate创建日期(止)
* workflowid工作流id
* @throws Exception
*/
public RequestBase[] GetPendingRequestBySearch(int creatorId, String createStartDate,String createEndDate,String workflowid) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
weaver.soa.workflow.request.client.ArrayOfRequestBase value = null;
return binding.getPendingRequestBySearch(creatorId, createStartDate,createEndDate,workflowid).getRequestBase();
// TBD – validate results
}
3.9 使用客户端获得已办列表
/**
* 流程已办列表
* userId人员id
* createStartDate创建日期(起)
* createEndDate创建日期(止)
* workflowid工作流id
* @throws Exception
*/
public RequestBase[] testGetHendledRequestBySearch(int userId, String createStartDate,String createEndDate,String workflowid) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
return binding.getHendledRequestBySearch( userId, createStartDate, createEndDate, workflowid).getRequestBase();
// TBD – validate results
}
3.10 使用客户端获得办结列表
/**
* 流程办结事宜列表
* userId人员id
* createStartDate创建日期(起)
* createEndDate创建日期(止)
* workflowid工作流id
* @throws Exception
*/
public RequestBase[] testtGetProcessedRequestBySearch(int userId, String createStartDate,String createEndDate,String workflowid) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
return binding.getProcessedRequestBySearch( userId, createStartDate, createEndDate, workflowid).getRequestBase();
// TBD – validate results
}
3.11 使用客户端获得我的请求列表
/**
* 流程我的请求列表
* creatorId创建人id
* createStartDate创建日期(起)
* createEndDate创建日期(止)
* workflowid工作流id
* @throws Exception
*/
public RequestBase[] GetMyRequestBySearch(int creatorId, String createStartDate,String createEndDate,String workflowid) throws Exception {
weaver.soa.workflow.request.client.RequestServiceHttpBindingStub binding;
try {
binding = (weaver.soa.workflow.request.client.RequestServiceHttpBindingStub)
new weaver.soa.workflow.request.client.RequestServiceLocator().getRequestServiceHttpPort();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError(“JAX-RPC ServiceException caught: ” + jre);
}
assertNotNull(“binding is null”, binding);
// Time out after a minute
binding.setTimeout(60000);
// Test operation
return binding.getMyRequestBySearch(creatorId, createStartDate,createEndDate,workflowid).getRequestBase();
// TBD – validate results
}
(完)
SUBMITTED BY WEAVER
2012-10-21
转载请注明:赫非域 » e-cology7Request(RequestService)Web Service接口使用说明