读书人

axis客户端接收不同参数门类

发布时间: 2012-10-06 17:34:01 作者: rapoo

axis客户端接收不同参数类型

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 {

?? call = (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));[ / color]
???????????? 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();?
???????? }?

?

深圳人才网?深圳招聘网?深圳人才招聘网?深圳人才大市场?

企业、个人免费注册,获取想要的深圳软件工程师招聘信息 月薪最低3000-8000,更有高端猎头职位!?

www.szrcwz.com???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

?? ? ? ? ? ? ? ? ?axis客户端接收不同参数门类

读书人网 >软件架构设计

热点推荐