工作中要调用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){
}
}