博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

android call webservice by ksoap 实例代码

Posted on 2012-03-23 16:57  shallwe99  阅读(585)  评论(0编辑  收藏  举报

工作中要调用webservice,现在就把一天的工作过程给总结一下,本人是菜鸟,希望后来的人少花些时间,就心满意足了。

前4部是外围的准备工作,第五步是webservice的实现。

1.首先下载ksoap包。http://download.csdn.net/detail/Imain/3670701这个csdn上可以下载,国外的网站下起来有点费劲。

2.因为访问internet所以在项目的manifest配置文件中加入    <uses-permission android:name="android.permission.INTERNET" />

我的manifest就如下面的一样。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".BTTestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

3.将ksoap包加入到项目中。这一步要是不清楚,在google上搜“eclipse  添加外部jar ”,应该会有答案。

4.在main activity 中启动新线程调用webservice。注意必须在独立线程中进行调用,否则会报异常。android不允许访问UI的线程去调用webservice。因为那很花时间。

具体代码如下: webservicehd  是在主线程中定义的一个handler,用于处理服务调用返回的消息。

    new Thread(){
     public void run(){
      String temp = WebServiceUtils.setPhoneMAC(1,"hello from android");
      Message msg = webservicehd.obtainMessage();
      Bundle b = new Bundle();
      b.putString("returnvalue", temp);
      msg.setData(b);
      msg.sendToTarget();
     }
    }.start();

5.好了,现在正式进入web service的细节层面。我在容易出问题的地方进行了标注,其他的照抄就可以了。这个链接可以只看webservice的概念部分,例子就不用了吧。http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.MarshalBase64;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class WebServiceUtils {
  private static final String NAMESPACE = "http://www.e-mapping.com/";
  // WebService地址
  private static String URL = "http://66.18.231.40/bussys/messagesend/MessageSender.asmx"; //注意,不要带.WSDL
  private static final String METHOD_NAME = "setMAC";
  private static String SOAP_ACTION = "http://www.e-mapping.com/setMAC";//命名空间+方法名
  private static SoapObject resultSoapObject;
     public static String setPhoneMAC(int stuid,String mac){
      SoapObject soapObject = new SoapObject(NAMESPACE,METHOD_NAME);
      soapObject.addProperty("stuid",stuid);
      soapObject.addProperty("mac", mac);//定义对象,封装方法所需的参数
      
      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//注意此处的版本号需要与服务器端的soap保持一致,否则报异常。试试10,11,12哪个能用就行
      envelope.bodyOut = soapObject;
      envelope.dotNet = true;
      envelope.setOutputSoapObject(soapObject);
      (new MarshalBase64()).register(envelope);//注册,不知道这个语句有没有用,反正我加上了
      HttpTransportSE ht = new HttpTransportSE(URL);
      ht.debug = true;

      try{
          ht.call(SOAP_ACTION, envelope);
          resultSoapObject = null;
          resultSoapObject = (SoapObject)envelope.bodyIn;//注意这里不能用getResponse();否则报cast错误,至于getResponse()返回了啥东西,怎么解析,不管了,能用就行。
          if(resultSoapObject.getProperty(0).toString().equals("true"))
            return "true";
          else
             return "false";
      }catch(Exception e){   
      }

     }