來自: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 "";
}