• 11.Axis客户端接收不同参数类型


    转自:http://www.guance.com/708.html

    axis只支持简单类型的返回值。在这里逐一介绍axis的各种返回值接受。

    1. axis接受基本类型,如int, string等
    引入的系统文件:

    import javax.xml.namespace.QName;
    import javax.xml.rpc.ParameterMode;
    import javax.xml.rpc.ServiceException;

    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.XMLType;
    import org.apache.axis.encoding.ser.BeanDeserializerFactory;
    import org.apache.axis.encoding.ser.BeanSerializerFactory;

    Service service = new Service();//创建service对象
    Call call;
    try {
       all = (Call) service.createCall();//得到Call对象
       try {
           call.setTargetEndpointAddress(new java.net.URL(Constants.sns_sms_service));//将要访问的接口地址,将接口地址加上?wsdl在浏览器中访问 就可以查看到wsdl文件的信息,以及你所需要的参数名称等。
       } catch (MalformedURLException e) {
           e.printStackTrace();
       }
       call.setOperationName("sendSms");//WSDL 里面描述的接口名称
       call.getMessageContext().setUsername(Constants.sns_httpbase_username);//http 认证用户名
       call.getMessageContext().setPassword(Constants.sns_httpbase_password);//http 认证密码
       call.addParameter("sendnum", org.apache.axis.encoding.XMLType.XSD_STRING,

       javax.xml.rpc.ParameterMode.IN);//接口的参数 sendnum 为String类型。addParameter()第一个参数是参数的名称与wsdl中相对应必须相同。第二个参数是参数的类型 。也必须与wsdl相同。
       call.addParameter("acceptnums", org.apache.axis.encoding.XMLType.XSD_STRING,

       javax.xml.rpc.ParameterMode.IN);//接口的参数
       call.addParameter("smscnt", org.apache.axis.encoding.XMLType.XSD_STRING,

       javax.xml.rpc.ParameterMode.IN);//接口的参数
       call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 设置返回类型  简单类型的返回就可以这样简单操作,只要设置返回类型即可。甚至可以不设置返回类型。不设置返回类型操作方法请看2
     
       Object xml;
       try {
           xml = (Object)call.invoke(new Object[]{send,reving,content});//参数的顺序与addParameter的顺序相同,且设置了addParmaters就必须setRuturnType返回值
           //给方法传递参数,并且调用方法

           System.out.println("result is "+xml);
       } catch (RemoteException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

    } catch (ServiceException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }

    2. 不设置返回类型的简单类型返回值
    Service和Call的创建都与1相同。

    call = (Call) service.createCall();
    call.setOperationName(new QName(url, "getIByusername"));//getByusername是服务端接口的方法名称url是接口地址
    call.setTargetEndpointAddress(new java.net.URL(url));//接口地址
    Object o =  call.invoke(new Object[] { account ,IP, mcode });//这里直接传入参数,但是需要注意的是,传入的参数顺序必须与wsdl顺序相同,且类型相同。可以接收一个map的对象。

    3. 返回值为自定义对象

    try{
       String url = Constants.sns_login_service;
       Service service = new Service();
       Call call = (Call) service.createCall();
       call.setTargetEndpointAddress(url);
       call.setOperationName(new QName(url, "Login"));//Login为要调用的方法名

       //hoope.views.api.login_service.LoginService为 wsdl中 targetNamespace 的值 以下相同
       call.addParameter(new QName("hoope.views.api.login_service.LoginService","username"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的username为传入参数的变量名字
       call.addParameter(new QName("hoope.views.api.login_service.LoginService","pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的units为传入参数的变量名字
       call.addParameter(new QName("hoope.views.api.login_service.LoginService","code"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的code为传入参数的变量名字
       call.setReturnType(new QName("hoope.views.api.login_service.LoginService","response"), ITVAccount.class);//ITVAccount这里是重点,返回时主要在这配置,ITVAccount为返回的对象

       //注册映射关系
       QName XljgInfo = new QName("hoope.views.api.login_service.LoginService", "LoginInfoDict");//此处的 LoginInfoDict为WSDL文件中complexType name的属性值

       //这里注册映射关系,对自定义的类进行序列化与反序列化。
       call.registerTypeMapping(ITVAccount.class, XljgInfo, new BeanSerializerFactory(ITVAccount.class, XljgInfo), new BeanDeserializerFactory(ITVAccount.class, XljgInfo));//ITVAccount.class同上,

       ITVAccount itv =(ITVAccount)call.invoke(new Object[] {account,pwd,code});//接口接收的参数
       if(itv!=null){
           itv.setNickName(itv.getNickname());
           itv.setUserName(itv.getUsername());
           itv.setMobilePhone(itv.getUserphone());
       }
       System.out.println("xljg="+itv);//打印输出对象
    } catch (ServiceException e) {
       e.printStackTrace();
    } catch (RemoteException e) {
       e.printStackTrace();
    }

    4. 返回自定义数组对象
    返回数组对象与3相似,只要将注册返回类型为数组即可。

    try{
       String url = Constants.sns_login_service;
       Service service = new Service();
       Call call = (Call) service.createCall();
       call.setTargetEndpointAddress(url);
       call.setOperationName(new QName(url, "Login"));//Login为要调用的方法名

       //hoope.views.api.login_service.LoginService为 wsdl中 targetNamespace 的值 以下相同
       call.addParameter(new QName("hoope.views.api.login_service.LoginService","username"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的username为传入参数的变量名 字
       call.addParameter(new QName("hoope.views.api.login_service.LoginService","pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的units为传入参数的变量名字
       call.addParameter(new QName("hoope.views.api.login_service.LoginService","code"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的code为传入参数的变量名字
       call.setReturnType(new QName("hoope.views.api.login_service.LoginService","response"), ITVAccount[].class );//ITVAccount 这里是重点,返回时主要在这配置,ITVAccount为返回数组对象

       //注册映射关系
       QName XljgInfo = new QName("hoope.views.api.login_service.LoginService", "LoginInfoDict");//此处的 LoginInfoDict为WSDL文件中complexType name的属性值

       //这里注册映射关系,对自定义的类进行序列化与反序列化。
       call.registerTypeMapping(ITVAccount[].class , XljgInfo,new BeanSerializerFactory(ITVAccount[]. class, XljgInfo),new BeanDeserializerFactory(ITVAccount[]. class, XljgInfo));//ITVAccount.class同上,

       ITVAccount[] itv =(ITVAccount[]) call.invoke(new Object[] {account,pwd,code});//接口接收的参数
       System.out.println("xljg="+itv);//打印输出数组
    } catch (ServiceException e) {
       e.printStackTrace();
    } catch (RemoteException e) {
       e.printStackTrace();
    }

    5. 返回值为对象中包含对象及对象中包含数组

    try {
       Service service = new Service();
       Call call = (Call) service.createCall();
       call.setTargetEndpointAddress(url);
       call.setOperationName(new QName(url, "seachRelateUserInfo")); // seachRelateUserInfo为要调用的方法名
       call.getMessageContext().setUsername("admin"); // httpbase认证用户名
       call.getMessageContext().setPassword("admin"); // httpbase认证密码
       // hoope.views.api.userinfo_service.UserInfoWebService  为 wsdl中 targetNamespace 的值 以下相同
       call.addParameter(new QName("hoope.views.api.userinfo_service.UserInfoWebService" ,"condition"),XMLType.SOAP_STRING,ParameterMode.IN); // 这里的condition为传入参数的变量名字
       call.addParameter(new QName("hoope.views.api.userinfo_service.UserInfoWebService" ,"type"),XMLType.SOAP_INT,ParameterMode.IN); // 这里的type为传入参数的变量名字
       call.addParameter(new QName("hoope.views.api.userinfo_service.UserInfoWebService" ,"start"),XMLType.SOAP_INT,ParameterMode.IN); // 这里的start为传入参数的变量名字
       call.addParameter(new QName("hoope.views.api.userinfo_service.UserInfoWebService" ,"pagesize"),XMLType.SOAP_INT,ParameterMode.IN); // 这里的pagesize为传入参数的变量名字
       call.addParameter(new QName(" hoope.views.api.userinfo_service.UserInfoWebService","checkcode"),XMLType.SOAP_STRING,ParameterMode.IN); // 这里的checkcode为传入参数的变量名字
       call.setReturnType(new QName( " hoope.views.api.userinfo_service.UserInfoWebService","response"), MapInfoDict.class); // 这里设置返回值的类型

       // 注册映射关系
       // 此处的MapInfoDict userInfoDictArray userInfoDict为WSDL文件中complexType name的属性值  首先找到返回对象的complexType再看它中是否有其他的对象类型自定义对象类型,然后依次映射。
       // 这里返回对象的complexType为MapInfoDict,MapInfoDict中有一个userInfoDictArray的对 象,userInfoDictArray的对象中有一个List<UserInfoDict>的集合。
       // 问题就在这里,这个集合获取不到。
       QName XljgInfo = new QName("hoope.views.api.userinfo_service.UserInfoWebService","MapInfoDict");
       QName XljgInfo2 = new QName("hoope.views.api.userinfo_service.UserInfoWebService","userInfoDictArray");
       QName XljgInfo3 = new QName("hoope.views.api.userinfo_service.UserInfoWebService","userInfoDict");

       // 为自定义类型进行序列化和反序列化。必须与上面定义的QName匹配。它与服务端返回的类型做映射匹配。
       call.registerTypeMapping(MapInfoDict.class , XljgInfo, new BeanSerializerFactory(MapInfoDict.class , XljgInfo), new BeanDeserializerFactory(MapInfoDict.class , XljgInfo));
       call.registerTypeMapping(UserInfoDictArray.class , XljgInfo2, new BeanSerializerFactory(UserInfoDictArray.class , XljgInfo2), new BeanDeserializerFactory(UserInfoDictArray.class, XljgInfo2));

       //对 UserInfoDictArray中存在的是对象,则直接对对象进行序列化与反序列话即可。但如果UserInfoDictArray中的是List该 如何去映射呢?该如何序列化呢?还没找到实现方法。待解决中。。。望高人指点。
       call.registerTypeMapping(UserInfoDict.class , XljgInfo3, new BeanSerializerFactory(UserInfoDict.class , XljgInfo3), new BeanDeserializerFactory(UserInfoDict.class , XljgInfo3));
       MapInfoDict xljg = (MapInfoDict) call.invoke(new Object[] {parm, " 1 " , " 1 " , " 20 " , " itv " }); // 执行调用服务接口

       System.out.println("xljg=" + xljg); // 打印输出
    } catch (ServiceException e) {
       e.printStackTrace();
    } catch (RemoteException e) {
       e.printStackTrace();
    }

  • 相关阅读:
    我已经发表的文章:2,《上帝的小蚂蚁》(未经作者本人同意,不得转载!)
    【windows环境下】RabbitMq的安装和监控插件安装
    Apache FtpServer扩展【动手实现自己的业务】
    我的博客开始之旅
    curl和wget的区别和使用 wanglf
    ceph集群部署 wanglf
    ansible实现SSH配置免密互信 wanglf
    kubernetes(k8s) helm安装kafka、zookeeper wanglf
    django项目中使用KindEditor富文本编辑器 wanglf
    下一代网页:当HTML5取代Flash
  • 原文地址:https://www.cnblogs.com/sharpest/p/7856201.html
Copyright © 2020-2023  润新知