使用RPC方式调用WebService

调用WebService接口的方法有两种,

第一种就是RPC方式,很复杂

第二种用命令生成客户端代码方式调用,比较方便

 

使用RPC方式调用WebService的步骤如下:

1)创建RPCServiceClient对象

2)创建EndpointReference对象,并指定要访问WebService的URL(不包含wsdl)

3)创建QName对象,并指定要调用的WebService方法

4)创建描述WebService方法参数值的Object[]对象

5)创建描述WebService方法返回值类型的Class[]对象

6)使用RPCServiceClient类的invokeBlocking方法调用WebService方法

 

注意:invokeBlocking方法返回一个Object[]对象,如果方法返回单值,可以引用Object[]对象的第一个元素,也就是Object[0]

 

package client;
import org.apache.axis2.rpc.client.RPCServiceClient;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;

public class MyClient {
	public static void main(String[] args) throws AxisFault {
		/** 调用webser中nextNum方法 **/
		
		//第一步 创建RPCServiceClient对象
		RPCServiceClient serviceClient = new RPCServiceClient();
		Options options = serviceClient.getOptions();
		//第二步 远程wsdl文件 
		EndpointReference target = new EndpointReference(
				"http://localhost:8080/axis2/services/JaxWSImplService");
		options.setTo(target);
		//第三步 命名空间和方法
		QName addEntry = new QName("http://impl.service.jax/", "sayHello");
		//第四步 传入方法的参数,没有的话定义空数组
		Object[] addEntryArgs = new Object[]{ "shanshanbox.com" };
		//第五步 方法的返回值,可以不存在
		Class[] classes = new Class[] {String.class};
		
		Object[] invokeBlocking = serviceClient.invokeBlocking(addEntry, addEntryArgs, classes);
		
		System.out.println(invokeBlocking[0]);
		
		/** 调用webser中nextNum方法 **/
		addEntry = new QName("http://impl.service.jax/", "nextNum");
		classes = new Class[] { int.class };
		invokeBlocking = serviceClient.invokeBlocking(addEntry, new Object[]{ }, classes);
		System.out.println(invokeBlocking[0]);
	}
}

 

使用RPC方式调用WebService应注意如下几点:

1)客户端需要引用必要的jar包,反正我是把axis2的lib文件夹下所有的jar文件引入

2)上面的代码中使用RPCServiceClient类的invokeBlocking方法调用WebService方法。

invokeBlocking方法有三个参数,其中第一个类型是QName对象,表示要调用的方法;第二个

参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService

方法的返回值类型的Class对象,参数类型为Class[],当方法没有参数时,invokeBlocking方法的

第二个参数值不能为null。要使用new Object[]()

3)调用的WebService没有返回值,应使用RPCService类的invokeRobust方法,该方法只有两个参数

4)在创建QName对象时,QName类的构造方法的第一个参数表示WSDL的命名空间,也就是<wsdl definitions>元素的targetNamespa属性值

5)如果出现如下这种错误

Exception in thread "main" org.apache.axis2.AxisFault: The ServiceClass object does not implement the required method in the following form: OMElement sayHello(OMElement e)

请检查一下你的services.xml配置文件是否正确,如下格式

 <service name="simpleService">
 
    <description>    
        Web Service例子    
    </description>
    
    <parameter name="ServiceClass">    
        com.hous.service.SimpleService
    </parameter>
    <!-- 这里没有正确配置 -->
    <operation name="sayHello">
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"    
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
    </operation>
    
    <operation name="nextNum">
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"    
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
    </operation>
</service>    

Game Over You Are Win 

 

 

猜你喜欢

转载自shuizhongyue.iteye.com/blog/2291881