rpc调用webservice

ws发布后rpc的几种调用方式。

导入的几个jar:

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;

1、指明返回值类型的调用

public static void testxml() throws Exception{

  

  QName qname = new QName("
http://services.idcmanage.police.paibo.com/","addHostRoomFromIdc
");

  String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"

    + "<Body Description=\"IpConfig\" Code=\"0\">\n" 

    +" <Item  ID=\"32132_qq\" CARRIERS=\"3123123\" RECORD_NUM=\"123123\" NAME=\"11111\" ADDRESS=\"123123\" LINK_NAME=\"aaa\" LINK_TEL=\"123\" ID_CARD=\"123\" PERMIT_CODE=\"1323\" SERVER_NUM=\"0\" IDC_SERVER=\"9\" DOMAIN_NUM=\"100\" IP_RANGE=\"192.1.1.2\"  SAFE_INTERNET_INSTITUTION=\"qwe\" SAFE_INTERNET_TECHNIQUE=\"qwe\" idc_code=\"310111111\"/> \n"

    +" <Item  ID=\"32132_qq\" CARRIERS=\"3123123\" RECORD_NUM=\"123123\" NAME=\"11111\" ADDRESS=\"123123\" LINK_NAME=\"aaa\" LINK_TEL=\"123\" ID_CARD=\"123\" PERMIT_CODE=\"1323\" SERVER_NUM=\"0\" IDC_SERVER=\"9\" DOMAIN_NUM=\"100\" IP_RANGE=\"192.1.1.2\"  SAFE_INTERNET_INSTITUTION=\"qwe\" SAFE_INTERNET_TECHNIQUE=\"qwe\" idc_code=\"310111111\"/> \n"

    + "</Body>";

  Object[] param = new Object[] { xml };

  String result="";

  RPCServiceClient client =null;

  try {

   client = new RPCServiceClient();

   Options options =  new Options();

   options.setAction("urn:addHostRoomFromIdc");

   options.setTo(new EndpointReference("
http://192.168.1.151:9999/services/SendIdcManageService/?wsdl
"));

   client.setOptions(options);

   Class[] classtmp = new Class []{String.class};//输出返回值内容

   result = (String) ((Object[])client.invokeBlocking(qname,param, classtmp))[0];

   System.out.println(result);

    client.cleanupTransport();

  } catch (AxisFault e) {

   e.printStackTrace();

   logger.error("********sendSMSofSx:",e);

  }catch (Exception e) {

   e.printStackTrace();

   logger.error("********sendSMSofSx:",e);

  }finally{

   if(client!=null){

    client.cleanupTransport();

   }

  }

 }

2、无指定返回值类型的调用,此时发布的ws参数必须为默认的arg0

public static void testxml() throws Exception{

  

  QName qname = new QName("
http://services.idcmanage.police.paibo.com/","addHostRoomFromIdc
");

  String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"

    + "<Body Description=\"IpConfig\" Code=\"0\">\n" 

    +" <Item  ID=\"32132_qq\" CARRIERS=\"3123123\" RECORD_NUM=\"123123\" NAME=\"11111\" ADDRESS=\"123123\" LINK_NAME=\"aaa\" LINK_TEL=\"123\" ID_CARD=\"123\" PERMIT_CODE=\"1323\" SERVER_NUM=\"0\" IDC_SERVER=\"9\" DOMAIN_NUM=\"100\" IP_RANGE=\"192.1.1.2\"  SAFE_INTERNET_INSTITUTION=\"qwe\" SAFE_INTERNET_TECHNIQUE=\"qwe\" idc_code=\"310111111\"/> \n"

    +" <Item  ID=\"32132_qq\" CARRIERS=\"3123123\" RECORD_NUM=\"123123\" NAME=\"11111\" ADDRESS=\"123123\" LINK_NAME=\"aaa\" LINK_TEL=\"123\" ID_CARD=\"123\" PERMIT_CODE=\"1323\" SERVER_NUM=\"0\" IDC_SERVER=\"9\" DOMAIN_NUM=\"100\" IP_RANGE=\"192.1.1.2\"  SAFE_INTERNET_INSTITUTION=\"qwe\" SAFE_INTERNET_TECHNIQUE=\"qwe\" idc_code=\"310111111\"/> \n"

    + "</Body>";

  Object[] param = new Object[] { xml };

  String result="";

  RPCServiceClient client =null;

  try {

   client = new RPCServiceClient();

   Options options =  new Options();

   options.setAction("urn:addHostRoomFromIdc");

   options.setTo(new EndpointReference("
http://192.168.1.151:9999/services/SendIdcManageService/?wsdl
"));

   client.setOptions(options);

   OMElement element = client.invokeBlocking(qname, param);

   result = element.getFirstElement().getText();

   System.out.println(result);

    client.cleanupTransport();

  } catch (AxisFault e) {

   e.printStackTrace();

   logger.error("********sendSMSofSx:",e);

  }catch (Exception e) {

   e.printStackTrace();

   logger.error("********sendSMSofSx:",e);

  }finally{

   if(client!=null){

    client.cleanupTransport();

   }

  }

 }

3、上两种方式都无法适用自定义的ws方式。特别是自定义的方法参数名称,即适用@WebParam(name="xml")

public static void testxml() throws Exception{

  String path = "D:\\idcxml\\"+"addHostRoomFromIdc"+".xml";

  File file = new File(path);

  FileReader fr = new FileReader(file);

  BufferedReader br = new BufferedReader(fr);

  String xml = "";

  String readline  = "";

  while((readline=br.readLine())!=null){

   xml = readline;

   System.out.println(xml);

  }

  String result="";

  RPCServiceClient client =null;

  try {

   client = new RPCServiceClient();

   Options options =  new Options();

   options.setTo(new EndpointReference("
http://192.168.1.151:9999/services/SendIdcManageService/?wsdl
"));

   client.setOptions(options);

    // 创建一个OMFactory,下面的namespace、方法与参数均需由它创建 

         OMFactory factory = OMAbstractFactory.getOMFactory(); 

         // 创建命名空间 

         OMNamespace namespace = factory.createOMNamespace("
http://services.idcmanage.police.paibo.com/
", "urn"); 

         // 参数对数 ******重要*******有些是指定方法名的。增加之后可以自定义参数名称

         OMElement nameElement = factory.createOMElement("arg0", null); 

         nameElement.addChild(factory.createOMText(nameElement, xml)); 

         // 创建一个method对象 

         OMElement method = factory.createOMElement("addHostRoomFromIdc", namespace); 

         method.addChild(nameElement); 

         OMElement resultOM = client.sendReceive(method); 

         result = resultOM.getFirstElement().getText();

   System.out.println(result);

    client.cleanupTransport();

  } catch (AxisFault e) {

   e.printStackTrace();

   logger.error("********sendSMSofSx:",e);

  }catch (Exception e) {

   e.printStackTrace();

   logger.error("********sendSMSofSx:",e);

  }finally{

   if(client!=null){

    client.cleanupTransport();

   }

  }

 }

推荐适用第三种方式,ws的请求就可以轻松自定义(都是测试通过的,根据自己需要调整)

时间: 2024-08-03 02:36:02

rpc调用webservice的相关文章

java接口调用——webservice就是一个RPC而已

很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过socket实现rpc,以及服务的注册和动态上下线.这里先上一篇RPC的实现者一webservice,便于后面理解源码执行过程,框架就是在原理的基础上提供更加便捷的使用而已,协议就是基于TCP或UDP之上,服务者和调用者之间约定消息按照什么样的格式发送以及解析罢了.协议没什么高深莫测的. 原文和作者

Android通过ksoap2这个框架调用webservice大讲堂

昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有必要把这些东西整合起来,一方面自己有时候也看,另一方面当然是能帮助没有做个的小伙伴,其实东西不是很多,就是讲的有点详细,不怕多,就怕不仔细, WebServices简介 Web services是一种部署在Web上的对象或者组件,能够通过Internet进行调用的应用程序.Web services

(26)C#调用WebService实例和开发

转自  http://www.cnblogs.com/nianyuwen/archive/2012/05/15/2500932.html 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册. XML:(Extensible Markup

Android调用WebService

这两天给老师做地铁app的demo,与后台的交互要用WebService,还挺麻烦的.所以想写点,希望有用. Web Services(Web服务)是一个用于支持网络间不同机器互操作的软件系统,它是一种自包含.自描述和模块化的应用程序,它可以在网络中被描述.发布和调用,可以将它看作是基于网络的.分布式的模块化组件.它建立在HTTP,SOAP,WSDL这些通信协议之上,可以轻松的跨平台. 我们用的WebService就是服务器公布的一个接口,连上之后可以交互.WSDL是一份XML文档,它描述了We

调用webservice异常总结

发布和调用Webservice很简单,但小问题依然不断,特总结如下: 一.Java调用.net的webService产生"服务器未能识别 HTTP 标头 SOAPAction 的值"错误. 解决方案: 调用webservice时,没有指定SoapAction,没有指定RequestNameSpace,所以请求时总是出现"服务器未能识别 HTTP 标头 SOAPAction 的值. 如果使用axis调用,请按以下方式调用: public static void main(Str

activiti designer源码的研究(一) 采用Axis2调用Webservice

最近由于项目的需要,需要对eclipse中的Eclipse Activiti designer插件进行扩充,使其能够调用的webservice,但是遇到了classNotFoundException,我的方法如下: <1> 在org.activiti.designer.gui中添加了调用webserviced的类 <2> 在org.activiti.designer.lib中添加了axis2的jar <3> 在org.activiti.designer.lib的mani

java axis调用WebService 服务端,客户端

服务端: 1.Calculator package ws; public class Calculator { public int add(int a, int b) { return (a + b); } public int subtract(int a, int b) { return (a - b); } public int multiply(int a, int b) { return (a * b); } public int divide(int a, int b) { ret

C#调用WebService

1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册. XML:(Extensible Markup Language)扩展型可标记语言.面向短期的临时数据处理.面向万维网络,是Soap的基础. Soap:(Simple Object A

Java调用WebService

Java调用WebService可以直接使用Apache提供的axis.jar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用.理论上是一样的,只不过用Eclipse自动生成代码省事些. 1.编写代码方式: package com.yudun.test; import java.rmi.RemoteException;import org.apache.axis.client.Call;import org.apache.axis