Android調用.net編寫的webservice

來源:互聯網
上載者:User

來自:http://blog.csdn.net/guochunyang/article/details/6203232 

JSR172規範來調過webservice感覺賊好用,使用J2ME的JSR172來產生stub並加入到項目中調用,調試了半天最後以失敗告終,實在沒辦法了,只能另尋其它的組件,如果自己通過HttpConnection來串連的擷取資料的話要封裝的東西太多了,不划算。最後找到了KSoap2,在網上找了N多例子回來看,那些例子基本上都是互抄的,沒一個能用,真鬱悶。不過還好,起碼知道了一條思路,自己慢慢研究,最終成功了,下面附上代碼和說明:

附件:開發中ksoap2組件使用了ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar,可以點選連結下載;

1、要使android的程式串連網路必須要在AndroidManifest.xml檔案中加入下面這句話:

<!-- 串連網路必須要設定該項 -->
 <uses-permission android:name="android.permission.INTERNET"/>

否則會報沒許可權的異常;

2、使用dotnet寫webservcie要注意使用RPC模式,(1)首先在你的webservice類中用System.Web.Services.Protocols.SoapRpcServiceAttribute屬性指定;(2)在具體的webservice方法中也要指定屬性System.Web.Services.Protocols.SoapRpcMethodAttribute屬性;

如:

    [WebService(Namespace = "http://tempuri.org/")]//指定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; }
    }

 

————————————————————————————————

3、下面是android中的調用方法

要在webservice傳輸自定類型必須繼承KvmSerializable介面

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;
 }
 }

 @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的具體方法

public String SayHello(){
  String nameSpace = "http://tempuri.org/";
  String methodName = "HelloWorld";
  String soapAction = "http://tempuri.org/HelloWorld";

  String url = "http://192.168.2.51/Default.asmx?wsdl";//後面加不加那個?wsdl參數影響都不大
  
  //建立webservice連線物件
  org.ksoap2.transport.HttpTransportSE transport = new HttpTransportSE(url);
  transport.debug = true;//是否是偵錯模式
  
  //設定串連參數
  SoapObject soapObject = new SoapObject(nameSpace, methodName);
  User user = new User();
  user.setProperty(0, "zhi");
  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 "";
 }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.