JAVA利用axis实现调用webService

1. 环境依赖

  • jdk1.8
  • maven
		<dependency>
			<groupId>axis</groupId>
			<artifactId>axis</artifactId>
			<version>1.4</version>
		</dependency>

2. CreateCallUtil

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;
    }

}

3. 使用

3.1 返回基本类型和String

  使用的时候,会设置参数类型,常见的参数类型如下:

	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);

3.2 返回对象

  如果返回的是对象,需要服务端提供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.3 返回数组

  以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});

你可能感兴趣的:(java)