在使用Axis2-1.6.1实现第一个Web Service一文中发布了一个SimpleService,现在分别使用RPC方法以及wsdl2java在客户端调用该Web Service服务。
使用RPC方式(6)步
在eclipse中新建一个项目,并在package包中新建RPCClient类
1.创建RPCServiceClient对象
2.创建EndpointReference对象,并指定要访问的Web Service的URL(不包含wsdl)
3.创建描述Web Service方法参数值的Object[]对象
4.创建Web Service方法返回值类型的Class[]对象
5.创建QNAME对象,并指定要调用的Web Service方法
6.使用RPCServiceClient类的invokeBlocking方法调用Web Service。
package client;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class RPCClient {
public static void main(String[] args) throws Exception {
//第1步
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
//第2步
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/axis2/services/SimpleService/");
options.setTo(targetEPR);
Object[] opAddEntryArgs = new Object[]{"superman"};//第3步
Class[] classes = new Class[]{String.class};//第4步
//在创建QName对象时,QNAME类的构造方法的第一个参数表示WSDL的命名空间,也就是<wsdl:definitions>元素的targetNamespace属性值。
QName opAddEntry = new QName("http://ws.apache.org/axis2","getGreeting");//第5步
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0]);//第6步
classes = new Class[]{int.class};
opAddEntry = new QName("http://ws.apache.org/axis2","getPrice");
System.out.println(serviceClient.invokeBlocking(opAddEntry,new Object[]{},classes)[0]);//第二个参数表示要调用的web service方法的参数值,无参不能用null,应该用长度为0的object数组
//如果调用的Web Service方法没有返回值,应该使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同
}
}
invokeBlocking方法采用了同步的方式来调用Web Service,异步方式另表。
不过这种方式调用Web Service方法相当麻烦,Axis2提供wsdl2java命令,该命令可以根据WSDL的内容自动生成调用Web Service客户端的stub类,然后客户端就可以像调用本地类一样使用stub类。
使用wsdl2java命令简化客户端编写
使用wsdl2java命令之前,建议先设置一下AXIS2_HOME环境变量。系统变量名:AXIS2_HOME,变量值及上一篇中下载的axis2-1.6.1-bin.zip解压后的根目录所在地址,我是解药到D盘,地址为D:\axis2-1.6.1\。
使用如下的命令生成客户端的stub类:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p client -s -o stub
*其中-uri指定了wsdl文件的地址(可以是本地路径,也可以是web路径),-p指定了生成的stub类的包名, -o指定了存放stub类的目录名
*注意:Web Service方法的返回值和参数值都封装在了相应的类中,例如:getGreeting方法的返回值封装在GetGreetingResponse类中,参数值封装在GetGreeting类中。
将使用上述命令后得到的stub目录下生成的SimpleServiceStub.java复制到eclipse工程中,新建StubSimpleClient.java类,代码如下:
package client;
import org.apache.axis2.AxisFault;
public class StubSimpleClient {
public static void main(String[] args) throws Exception {
SimpleServiceStub stub = new SimpleServiceStub();
SimpleServiceStub.GetGreeting gg = new SimpleServiceStub.GetGreeting();
gg.setArgs0(" leolee");
System.out.println(stub.getGreeting(gg).local_return);
System.out.println(stub.getPrice(new SimpleServiceStub.GetPrice()).local_return);
}
}
运行后控制台得到hello leolee和一个随机数,调用Web Service成功
webservice如何使用其他的类
- (1)如果在web service类中需要import其他的类,那么需要将这些类放在
package test;
public class MyClass{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
SimpleService类需要做相应修改:
import test.MyClass;
public class SimpleService{
public String getGreeting(String name){
return "hello " + name;
}
public int getPrice(){
return new java.util.Random().nextInt(1000);
}
public MyClass getMyClass(){
MyClass myclass = new MyClass();
myclass.setName("lilei");
return myclass;
}
}
编译MyClass.java和SimpleService.java:
javac -d . MyClass.java SimpleService.java
将test目录及目录中的MyClass.class文件复制到WEB-INF\classes目录中,将SimpleService.class复制到WEB-INF\pojo目录中。修改StubSimpleClient.java类,在最后增加一行代码
package client;
import org.apache.axis2.AxisFault;
public class StubSimpleClient {
public static void main(String[] args) throws Exception {
SimpleServiceStub stub = new SimpleServiceStub();
SimpleServiceStub.GetGreeting gg = new SimpleServiceStub.GetGreeting();
gg.setArgs0(" leolee");
System.out.println(stub.getGreeting(gg).local_return);
System.out.println(stub.getPrice(new SimpleServiceStub.GetPrice()).local_return);
System.out.println(stub.getMyClass(new SimpleServiceStub.GetMyClass()).local_return.getName());
}
}
运行后控制台显示结果:
hello leolee
837
lilei