1.首先我们先实例化一个可以调用webservice的Call:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
public String WsClient(){ Call call; Service webService = new Service();
call = (Call) webService.creatCall(); }
2.然后我们需要为这个call指定请求的地址和方法以及返回的格式:
解释一下这里需要的三个主要参数:URL、URI和localPart。
URL为请求服务端的地址,这个是已知的(如果我们连服务端地址都不知道怎么请求。。。)。
URI和localPart分别是我们请求的服务端方法的定位地址和方法名。我也不确定一般工作中这两个参数是未知还是服务端人员给出,因为我碰到两次外包的服务端坑逼连这是什么东西都不知道,就直接给了我个URL地址,给了个接口文档还是错误的。
在只知道URL的情况下怎么获取URI和请求方法呢?我们在浏览器输入给定的URL然后加上“?wsdl”就会得到一个关于服务端信息的xml文档,看不懂没关系,只要找到我们需要的东西就行了。其中targetNamespace标签的内容为我们需要的URI,标签名字中带有operation的为服务端所有可供调用的方法。资源定位符,顾名思义就是通过这个URI地址可以确定是调用的那个方法,这个URI就是方法所在的类路径的反序。
public String WsClient(){ ...
call.setTargetEndpointAddress(new java.net.URL(URL));//参数URL为给定的服务端地址
call.setOperationName(new QName(namespaceURI,localPart,perfix)); //namespaceURI为服务端URI,localPart为请求的方法名,perfix可不写 call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型
call.setSOAPActionURI("xxx");//如果不需要通过soapAction header寻找对应的方法,可忽略 }
3.给call添加参数,上面那个名为localPart的方法接受这几个参数:
public String WsClient(){ ... call.addParameter("arg0",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("arg1",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("arg2",XMLType.XSD_STRING,ParameterMode.IN);
... }
4.调用:
public String WsClient(){ ... String result = (String)call.invoke(new Object[] {paramname1,paramname2,paramname3}); }
这里上面addParameter几个参数,Object[]里面就要有几个元素。注意这里arg0、arg1、arg2不是localPart形参的名称,而是就要写成arg0这种形式,表示入参顺序。localPart方法有几个参数就写到第几个,从arg0开始,与Object[]一一对应,没有的话默认为null。比如对应方法有三个参数,但是我们addParameter只有arg0和arg2的时候,此时Object[]也应该只有两个元素(不然会报异常),这时服务端接受的参数为(arg0,null,arg2)。另外参数可以是xml格式的字符串。
以上就是用axis实现一个webservice客户端,其实有一种更简单的方法,那就是使用jdk自带的wsimport工具,wsimport可以帮我们自动生成客户端代码,生成后直接使用就可以了。