附件:開發中ksoap2組件使用了ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar,可以點擊鏈接下載;
1、要使android的程序連接網絡必須要在AndroidManifest.xml文件中加入下面這句話:
<!-- 連接網絡必須要設置該項 -->
?<uses-permission android:name="android.permission.INTERNET"/>
webservice json。否則會報沒權限的異常;
2、使用dotnet寫webservcie要注意使用RPC模式,(1)首先在你的webservice類中用System.Web.Services.Protocols.SoapRpcServiceAttribute屬性指定;(2)在具體的webservice方法中也要指定屬性System.Web.Services.Protocols.SoapRpcMethodAttribute屬性;
如:
??? [WebService(Namespace = "http://tempuri.org/指定webservice的名稱空間
webservice應用實例、??? [SoapRpcService]//指定使用rpc方式
??? public class Default : System.Web.Services.WebService
??? {
??????? [SoapRpcMethod, WebMethod]//具體方法中也要指定rpc方式
??????? public User HelloWorld(User user)
??????? {
??????????? User us = new User();
??????????? us.Name = "Hello " + user.Name;
??????????? us.Age = user.Age;
??????????? return us;
??????? }
??? }
??? //dotnet中的自定義實體類型
??? public class User
??? {
??????? public string Name { get; set; }
??????? public int Age { get; set; }
??? }
webservice java,?
————————————————————————————————
3、下面是android中的調用方法
要在webservice傳輸自定類型必須繼承KvmSerializable接口
調用webservice處理異常,public class User?implements KvmSerializable {
?private String name = null;
?private int age = 0;
?
?@Override
?public Object getProperty(int arg0) {
??// TODO Auto-generated method stub
??Object res = null;
??switch(arg0){
???case 0:
????res = this.name;
????break;
???case 1:
????res = this.age;
????break;
???default:
????break;
??}
??return res;
?}
?@Override
?public int getPropertyCount() {
??// TODO Auto-generated method stub
??return 2;
?}
?@Override
?public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
??// TODO Auto-generated method stub
??switch(arg0){
??case 0:
???arg2.type = PropertyInfo.STRING_CLASS;
???arg2.name = "Name";
???break;
??case 1:
???arg2.type = PropertyInfo.INTEGER_CLASS;
???arg2.name = "Age";
???break;
??default:
???break;
?}
?}
js調用webservice,?@Override
?public void setProperty(int arg0, Object arg1) {
??// TODO Auto-generated method stub
??if(arg1 == null) return;
??switch(arg0){
???case 0:
????this.name = arg1.toString();
????break;
???case 1:
????this.age = Integer.valueOf(arg1.toString());
????break;
???default:
????break;
??}
?}
}
?
4、
//調用webservice的具體方法
net調用webservice。public String SayHello(){
??String nameSpace = "http://tempuri.org/";
??String methodName = "HelloWorld";
??String soapAction = "http://tempuri.org/HelloWorld";
??String url = "??user.setProperty(1, 18);
??PropertyInfo pi = new PropertyInfo();
??pi.setName("user");//webservice接口的參數名,大小寫必須跟dotnet中的webservice暴露出來的名字一致
??pi.setValue(user);
??pi.setType(user.getClass());
??soapObject.addProperty(pi);//將自定參數加入請求對象中
??
??//設置返回參數
??SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//soap協議版本必須用SoapEnvelope.VER11(Soap V1.1)
??envelope.dotNet = false;//注意:這個屬性是對dotnetwebservice協議的支持,如果dotnet的webservice 不指定rpc方式則用true否則要用false
??envelope.bodyOut = transport;
??envelope.setOutputSoapObject(soapObject);//設置請求參數
??envelope.addMapping(nameSpace, "User", user.getClass());//傳對象時必須,參數namespace是webservice中指定的, name是服務器類型的名稱, claszz是自定義類的類型
??
??try {
?????? transport.call(soapAction, envelope);
?????? SoapObject sb = (SoapObject)envelope.bodyIn;//服務器返回的對象存在envelope的bodyIn中
?????? User us= (User)envelope.getResponse();//直接將返回值強制轉換為已知對象
?????? return us.getName() + us.getAge();
??} catch (IOException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??} catch (XmlPullParserException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??} catch(Exception ex){
???ex.printStackTrace();
??}
??return "";
?}