Android程式使用SOAP呼叫遠端WebService服務

乞力馬紮羅的雪CYF發表於2015-08-06

        在如今的應用程式中,不可能不使用到網路,並且後臺一定是有伺服器作為支撐的。如今最常見的呼叫方式有HTTP的GET ,POST方式,返回JSON或者XML資料。但是也有一種常見的形式就是呼叫WebService。現在我們來實現一下在Android端使用SOAP簡單物件訪問協議來呼叫WebService資料。主要的需求是根據某個手機號碼返回這個號碼的運營商,卡型別以及歸屬地等資訊。

(1)先從網上下載一個ksoap的jar包,放入專案的libs資料夾下,我也提供百度網盤的下載:http://pan.baidu.com/s/1o6svnC2    。

(2)推薦一個可以呼叫WebService的網站,上面提供了很多的服務,http://www.webxml.com.cn/zh_cn/index.aspx   。

(3)在Activity中的實現的程式碼如下:主要做介面顯示操作,並初始化一些WebService呼叫的引數,如URL地址,名稱空間,方法名稱,引數列表等。

package com.example.testwebservice2;

import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

	private Context context;

	private static final String URL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";// 請求的url
	private static final String NAMESPACE = "http://WebXml.com.cn/";// 請求的名稱空間;
	private static final String METHODNAME = "getMobileCodeInfo"; // 方法名稱,獲得國內手機號碼歸屬地省份,地區和手機卡型別資訊;
	private EditText phoneNum;
	private Button query;
	private TextView showResult;

	private Handler handler = new Handler() {// 重新整理介面;
		public void handleMessage(Message msg) {
			String myData = msg.getData().getString("data");// 這裡是完全解析好後的資料;用於顯示;
			if (myData != null || !"".equals(myData)) {
				showResult.setText(myData);
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		this.context = this;
		initView();
		query.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 手機號碼(段)
				String phoneSec = phoneNum.getText().toString().trim();
				// 簡單判斷使用者輸入的手機號碼(段)是否合法
				if ("".equals(phoneSec) || phoneSec.length() < 7) {// 輸入不合法;
					phoneNum.setError("您輸入的手機號碼(段)有誤!"); // 給出錯誤提示
					phoneNum.requestFocus();
					// 將顯示查詢結果的TextView清空
					phoneNum.setText("");
					return;
				}
				ResponseOnClick(); // 輸入沒問題,開始請求資料;
			}
		});
	}

	private void initView() {
		phoneNum = (EditText) findViewById(R.id.phone_sec);
		query = (Button) findViewById(R.id.query_btn);
		showResult = (TextView) findViewById(R.id.result_text);
	}

	private void ResponseOnClick() {
		HttpThread thread = new HttpThread(handler, context);
		HashMap<String, Object> params = new HashMap<String, Object>();
		String phoneSec = phoneNum.getText().toString().trim();// 電話號碼;
		params.put("mobileCode", phoneSec);// mobileCode:字串,手機號碼,最少前七位數字;
		params.put("userId", "");// 字串,免費使用者為空字串;
		thread.doStart(URL, NAMESPACE, METHODNAME, params);
	}

}

(4)新建一個執行緒類,繼承自Thread,主要做訪問WebService的網路操作。接收返回的資料並傳遞給Activity。

package com.example.testwebservice2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

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

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

class HttpThread extends Thread {
	private Handler handler = null;
	private Context context = null;
	private String url = null;
	private String namespace = null;
	private String methodName = null;
	HashMap<String, Object> params = new HashMap<String, Object>();// 引數列表;
	private ProgressDialog progressDialog = null;

	// 建構函式
	public HttpThread(Handler handler, Context context) {
		this.handler = handler;
		this.context = context;
	}

	/**
	 * 啟動執行緒
	 */
	/**
	 * 要向伺服器傳遞的四個引數分別是: (1)URL (2)名稱空間 (3)方法名 (4)引數列表
	 * 
	 * @param url
	 * @param namespace
	 * @param methodName
	 * @param params
	 */
	public void doStart(String url, String namespace, String methodName,
			HashMap<String, Object> params) {
		this.url = url;
		this.namespace = namespace;
		this.methodName = methodName;
		this.params = params;
		progressDialog = ProgressDialog.show(context, "提示", "正在請求請稍等...", true);
		this.start();// 啟動這個執行緒;
	}

	/**
	 * 執行緒執行
	 */
	@Override
	public void run() {
		try {
			// web service 請求
			SoapObject result = (SoapObject) CallWebService();
			Log.i("HttpThread_getPropertyCount", result.getPropertyCount() + "");
			Log.i("HttpThread_getProperty(0)", result.getProperty(0) + "");
			// 構造資料
			String value = null;
			if (result != null && result.getPropertyCount() > 0) {
				for (int i = 0; i < result.getPropertyCount(); i++) {
					SoapPrimitive primitive = (SoapPrimitive) result
							.getProperty(i);
					value = primitive.toString();
				}
				/**
				 * 這裡獲得的value就是WebService的值: 18710498511:陝西 西安 陝西移動全球通卡
				 */
				// Log.i("HttpThread_value", value);
				// 取消進度框
				progressDialog.dismiss();
				// 構造訊息
				Message message = handler.obtainMessage();
				Bundle bundle = new Bundle();
				bundle.putString("data", value);// 傳遞到介面進行顯示;
				message.setData(bundle);
				handler.sendMessage(message);// 傳遞到到Activity的handmessage()中進行處理;
			}// if
		} catch (Exception e) {
			e.printStackTrace();
		}
	}// run();

	private Object CallWebService() {
		String SOAP_ACTION = namespace + methodName;// 名稱空間+方法名稱;
		SoapObject request = new SoapObject(namespace, methodName);// 建立SoapObject例項
		// 生成呼叫web service 方法的soap請求訊息
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER11);
		// 設定.net web service
		envelope.dotNet = true;

		// 請求引數
		if (params != null && !params.isEmpty()) {
			for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
				Map.Entry<String, Object> e = (Entry) it.next();
				request.addProperty(e.getKey().toString(), e.getValue());
			}
		}
		// 傳送請求
		envelope.setOutputSoapObject(request);
		HttpTransportSE transport = new HttpTransportSE(url);
		SoapObject result = null;
		try {
			// web service請求
			transport.call(SOAP_ACTION, envelope);
			result = (SoapObject) envelope.bodyIn;
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		Log.i("result", result.toString());
		return result;
	}// CallWebService();
}// HttpThread類;

 (5)程式執行結果如圖:

..


github主頁:https://github.com/chenyufeng1991  。歡迎大家訪問!

相關文章