<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
import cn.myapps.webservice.client.config.Const;
import org.apache.axis.AxisProperties;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
public class CreateCallUtil {
private org.apache.axis.client.Call call;
public CreateCallUtil(String url, String targetName) throws ServiceException {
Service service = new Service();
this.call = (org.apache.axis.client.Call) service.createCall();
//设置wsdl的路径
this.call.setTargetEndpointAddress(url);
//忽略https的ssl,如果不是https 可忽略
AxisProperties.setProperty("axis.socketSecureFactory", "org.apache.axis.components.net.SunFakeTrustSocketFactory");
//设置调用的方法
this.call.setOperationName(new QName(url, targetName));
//用户名
this.call.setUsername(Const.userName);
//密码
this.call.setPassword(Const.passWord);
this.call.setUseSOAPAction(true);
this.call.setEncodingStyle("UTF-8");
//设置超时时间,单位是毫秒
//call.setTimeout(10000);
}
public org.apache.axis.client.Call getCall() {
return call;
}
}
使用的时候,会设置参数类型,常见的参数类型如下:
XMLType.XSD_INT;
XMLType.XSD_STRING;
XMLType.SOAP_MAP;
//目标方法
String targetName = "xxxx";
//wsdl路径
String url= "http://127.0.0.1:8080/xxx/xxx?wsdl";
//创建call
Call call = new CreateCallUtil(url, targetName).getCall();
//设置接口返回int类型参数
call.setReturnType(XMLType.XSD_INT);
//addParameter的第一个参数需要与调用接口的参数名称一致,而且addParameter的顺序也要去调用接口的参数顺序一致。
call.addParameter("param1", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("param2", XMLType.SOAP_MAP, ParameterMode.IN);
int resultInt = (int) call.invoke(new Object[]{param2, param2});
返回String的话,修改一下setReturnType就可以。
call.setReturnType(XMLType.XSD_STRING);
如果返回的是对象,需要服务端提供namespaceURI和localPart,一般在server-config.wsdd的service里的beanMapping里,qname的值localPart,xmlns:myns的值为namespaceURI,还需要服务端提供Bean的元素。本地做好GetSet。
<beanMapping qname="myns:Bean" xmlns:myns="urn:model.webservice.test.cn"
languageSpecificType="java:cn.test.webservice.model.Bean"/>
//目标方法
String targetName = "xxxx";
//wsdl路径
String url= "http://127.0.0.1:8080/xxx/xxx?wsdl";
//创建call
Call call = new CreateCallUtil(url, targetName).getCall();
//设置接口返回类型
QName qn = new QName("urn:model.webservice.test.cn", "Bean");
call.registerTypeMapping(Bean.class, qn, new BeanSerializerFactory(Bean.class, qn), new BeanDeserializerFactory(Bean.class, qn));
call.setReturnClass(Bean.class);
//addParameter的第一个参数需要与调用接口的参数名称一致,而且addParameter的顺序也要去调用接口的参数顺序一致。
call.addParameter("param1", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("param2", XMLType.SOAP_MAP, ParameterMode.IN);
Bean bean = (Bean) call.invoke(new Object[]{param2, param2});
以3.2为例,如果返回的是Collection<Bean>,那设置返回类型的时候如下。
//目标方法
String targetName = "xxxx";
//wsdl路径
String url= "http://127.0.0.1:8080/xxx/xxx?wsdl";
//创建call
Call call = new CreateCallUtil(url, targetName).getCall();
//设置接口返回类型
QName qn = new QName("urn:model.webservice.test.cn", "Bean");
call.registerTypeMapping(Bean.class, qn, new BeanSerializerFactory(Bean.class, qn), new BeanDeserializerFactory(Bean.class, qn));
call.setReturnClass(Bean[].class);
//addParameter的第一个参数需要与调用接口的参数名称一致,而且addParameter的顺序也要去调用接口的参数顺序一致。
call.addParameter("param1", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("param2", XMLType.SOAP_MAP, ParameterMode.IN);
Bean[] bean = (Bean[]) call.invoke(new Object[]{param2, param2});