webservice客户端调用service的两种方法

最近在使用webservice做系统,同时自己需要调用别人的webservice获取相应的数据,自己总结了下,将关键代码整理如下,备以后使用。

第一种方法:采用RPCServiceClient调用service

首先创建一个存储访问webservice参数的类,模板如下:

public class CallServiceBean
{
private String targetEPR;
private Object[] parameters;
private Class<?>[] returnClasses;
private String action;
private String callMethod;
public String getCallMethod()
{
  return callMethod;
}

public void setCallMethod(String callMethod)
{
  this.callMethod = callMethod;
}

public String getTargetEPR()
{
  return targetEPR;
}

public void setTargetEPR(String targetEPR)
{
  this.targetEPR = targetEPR;
}

public Object[] getParameters()
{
  return parameters;
}

public void setParameters(Object[] parameters)
{
  this.parameters = parameters;
}

public Class<?>[] getReturnClasses()
{
  return returnClasses;
}

public void setReturnClasses(Class<?>[] returnClasses)
{
  this.returnClasses = returnClasses;
}

public String getAction()
{
  return action;
}

public void setAction(String action)
{
  this.action = action;
}
}



其次编写访问并接受service返回的参数的代码:

import org.apache.axis2.rpc.client.RPCServiceClient;



/**
  * 组织webservice调用参数
  * @param departmentCode
  * @param password
  * @param MaxDateTime
  * @return
  */
public CallServiceBean getCallServiceBean(String departmentCode,String password,String MaxDateTime){
  CallServiceBean callServiceBean = new CallServiceBean();

//wsdl地址
  callServiceBean.setTargetEPR(http://127.0.0.1:5888/services/childService?wsdl);

//参数列表
  callServiceBean.setParameters(new Object[]{departmentCode,password,MaxDateTime});

//调用的wsdl方法
  callServiceBean.setCallMethod("downloadImmunization");

//设置接受service返回的参数类型
  callServiceBean.setReturnClasses(new Class[]{DataHandler.class});
  return callServiceBean;
}



/**
  * 获取WebService数据
  * callServiceBean 保存调用webservice的参数
  */
public Object[] callReturnService(CallServiceBean callServiceBean) {
  try {
   RPCServiceClient serviceClient = new RPCServiceClient();
   Options options = serviceClient.getOptions();
   // 指定调用 WebService的 URL
   EndpointReference targetEPR = new EndpointReference(callServiceBean.getTargetEPR());
   options.setTo(targetEPR);
   if (null != callServiceBean.getAction()) {
    options.setAction(callServiceBean.getAction());
   }
   //options.setTimeOutInMilliSeconds(80000000);
   // 指定调用方法的参数值
   Object[] opAddEntryArgs = callServiceBean.getParameters() == null ? new Object[] {} : callServiceBean.getParameters();
   // 指定要调用的方法及 WSDL文件的命名空间
   QName opAddEntry = new QName(Constants.NUL, callServiceBean.getCallMethod());
   return serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, callServiceBean.getReturnClasses());
  } catch (RemoteException e) {
   e.printStackTrace();
   //增加线程休眠
   try {
    Thread.sleep(5000);
   } catch (InterruptedException e1) {
    e1.printStackTrace();
   }
  }
  return null;
}



注意:这里的参数列表String departmentCode,String password,String MaxDateTime,自己可以根据自己的实际需要来定义。



第二种方法,采用cxf的代理工厂bean

代码如下:

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;



JaxWsProxyFactoryBean jwpf = new JaxWsProxyFactoryBean();// 代理工厂Bean

  jwpf.setServiceClass(IWsEhrIndexBO.class);
  jwpf.setAddress("http://localhost:8080/WSReceiveData/services/ehrIndex");
  IWsEhrIndexBO client = (IWsEhrIndexBO) jwpf.create();
  EhrIndex ehrIndex = new EhrIndex();
  ehrIndex.setEhrId("wme32613");
  ehrIndex.setPatientId("58600820120423000001");
  ehrIndex.setSystemCode("SZ000001-10");
  ehrIndex.setCreateUnit("SZ586005");
  List<EhrIndex> list = new ArrayList<EhrIndex>();
  list.add(ehrIndex);
  client.saveEhrIndex(list);

注意:如果有返回类型,可以采用cxf的客户端生成对应的接收参数的类来接收这个返回值(可以参见cxf官方文档说明),自己根据实际需要,从返回值中提取对自己有用的信息。

猜你喜欢

转载自xiyuhanfei.iteye.com/blog/1607424