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();
}
-----------------------------------------------------望對學習者有所幫
助------------------------------------------------------------------