Android 中利用 ksoap2 調(diào)用 WebService的示例代碼
去年剛剛工作的時(shí)候,第一個(gè)項(xiàng)目是要訪問(wèn) WebService。由于沒(méi)有接觸過(guò),查了很多資料,在別人代碼的基礎(chǔ)上稍微修改了一下,總算滿足了自己的需求。最近整理電腦的時(shí)候,發(fā)現(xiàn)了這個(gè) WebService 的訪問(wèn)類(lèi),怕哪一天需要的時(shí)候找不到了,干脆寫(xiě)在博客上吧,也給需要的人提供一個(gè)參考。
1.下載 ksoap2 的 jar 文件
下載地址:ksoap2-android-assembly-3.6.1-jar-with-dependencies.jar
下載完成后依賴到自己的項(xiàng)目中即可。
2.封裝網(wǎng)絡(luò)訪問(wèn)工具類(lèi)
直接貼代碼了,注釋寫(xiě)的很詳細(xì),根據(jù)自己的需要加以修改。
/**
* 訪問(wèn) WebService 的工具類(lèi)
*/
public class WebServiceUtil {
// 命名空間
private static final String NAMESPACE = "your namespace";
// WebService 服務(wù)器地址
private static final String ENDPOINT = "your address";
// 一般自己公司開(kāi)發(fā)都是需要身份驗(yàn)證的
// 身份驗(yàn)證方法名
private static final String ID_HEADERNAME = "verify method";
// 身份驗(yàn)證 key
private static final String ID_NAME_PARAM = "verify key1";
// 身份驗(yàn)證 value
private static final String ID_NAME_VALUE = "verify value1";
// 身份驗(yàn)證 key
private static final String ID_PASSWORD_PARAM = "verify key2";
// 身份驗(yàn)證 value
private static final String ID_PASSWORD_VALUE = "verify value2";
// 訪問(wèn)的服務(wù)器是否由 dotNet 開(kāi)發(fā)
public static boolean isDotNet = true;
// 線程池的大小
private static int threadSize = 5;
// 創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池,以共享的無(wú)界隊(duì)列方式來(lái)運(yùn)行這些線程
private static ExecutorService threadPool = Executors.newFixedThreadPool(threadSize);
// 連接響應(yīng)標(biāo)示
public static final int SUCCESS_FLAG = 0;
public static final int ERROR_FLAG = 1;
/**
* 調(diào)用 WebService 接口
*
* @param methodName WebService 的調(diào)用方法名
* @param mapParams WebService 的參數(shù)集合,可以為 null
* @param reponseCallBack 服務(wù)器響應(yīng)接口
*/
public static void call(final String methodName, SimpleArrayMap<String, Object> mapParams, final ResponseCallBack reponseCallBack) {
// 創(chuàng)建 HttpTransportSE 對(duì)象,傳遞 WebService 服務(wù)器地址
final HttpTransportSE transport = new HttpTransportSE(ENDPOINT);
transport.debug = true;
// 身份驗(yàn)證(如果需要的話)
Element[] header = new Element[1];
// 傳入命名空間與驗(yàn)證的方法名
header[0] = new Element().createElement(NAMESPACE, ID_HEADERNAME);
// 創(chuàng)建參數(shù) 1
Element userName = new Element().createElement(NAMESPACE, ID_NAME_PARAM);
userName.addChild(Node.TEXT, ID_NAME_VALUE);
header[0].addChild(Node.ELEMENT, userName);
// 創(chuàng)建參數(shù) 2
Element password = new Element().createElement(NAMESPACE, ID_PASSWORD_PARAM);
password.addChild(Node.TEXT, ID_PASSWORD_VALUE);
header[0].addChild(Node.ELEMENT, password);
// 創(chuàng)建 SoapObject 對(duì)象用于傳遞請(qǐng)求參數(shù)
final SoapObject soapObject = new SoapObject(NAMESPACE, methodName);
// 添加參數(shù)
if (mapParams != null) {
for (int index = 0; index < mapParams.size(); index++) {
String key = mapParams.keyAt(index);
// 多數(shù)情況下,傳遞的參數(shù)都為 String 類(lèi)型,不過(guò)少數(shù)情況下會(huì)有 boolean 類(lèi)型,所以用 Object 代替
Object value = mapParams.get(key);
soapObject.addProperty(key, value);
}
}
// 實(shí)例化 SoapSerializationEnvelope,傳入 WebService 的 SOAP 協(xié)議的版本號(hào)
// 這里有 VER10 VER11 VER12 三種版本,根據(jù)自己需要填寫(xiě)
final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.headerOut = header; // 身份驗(yàn)證(如果需要的話)
envelope.dotNet = isDotNet; // 設(shè)置是否調(diào)用的是 .Net 開(kāi)發(fā)的 WebService
envelope.bodyOut = soapObject; // 傳遞參數(shù)
//envelope.setOutputSoapObject(soapObject);// 與上一句等價(jià)
// 用于與主線程通信的 Handler
final Handler responseHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 根據(jù)消息的 arg1 值判斷調(diào)用哪個(gè)接口
if (msg.arg1 == SUCCESS_FLAG) {
reponseCallBack.onSuccess((String) msg.obj);
} else {
reponseCallBack.onError((Exception) msg.obj);
}
}
};
// 提交一個(gè)子線程到線程池并在此線種內(nèi)調(diào)用 WebService
if (threadPool == null || threadPool.isShutdown()) {
threadPool = Executors.newFixedThreadPool(threadSize);
}
threadPool.submit(new Runnable() {
@Override
public void run() {
String result = null;
try {
// 解決 EOFException
System.setProperty("http.keepAlive", "false");
// 連接服務(wù)器,有的服務(wù)可能不需要傳遞 NAMESPACE + methodName,第一個(gè)參數(shù)傳遞 null
transport.call(null, envelope);
if (envelope.getResponse() != null) {
// 獲取服務(wù)器響應(yīng)返回的 SoapObject
SoapObject object = (SoapObject) envelope.bodyIn;
result = object.getProperty(0).toString();
}
} catch (IOException e) {
// 當(dāng) call 方法的第一個(gè)參數(shù)為 null 時(shí)會(huì)有一定的概念拋 IO 異常
// 因此需要需要捕捉此異常后用命名空間加方法名作為參數(shù)重新連接
// e.printStackTrace();
try {
transport.call(NAMESPACE + methodName, envelope);
if (envelope.getResponse() != null) {
// 獲取服務(wù)器響應(yīng)返回的 SoapObject
SoapObject object = (SoapObject) envelope.bodyIn;
result = object.getProperty(0).toString();
}
} catch (Exception e1) {
// e1.printStackTrace();
responseHandler.sendMessage(responseHandler.obtainMessage(0, ERROR_FLAG, 0, e1));
}
} catch (XmlPullParserException e) {
// e.printStackTrace();
responseHandler.sendMessage(responseHandler.obtainMessage(0, ERROR_FLAG, 0, e));
} finally {
// 將獲取的消息利用 Handler 發(fā)送到主線程
responseHandler.sendMessage(responseHandler.obtainMessage(0, SUCCESS_FLAG, 0, result));
}
}
});
}
/**
* 設(shè)置線程池的大小
*
* @param threadSize
*/
public static void setThreadSize(int threadSize) {
WebServiceUtil.threadSize = threadSize;
threadPool.shutdownNow();
threadPool = Executors.newFixedThreadPool(WebServiceUtil.threadSize);
}
/**
* 服務(wù)器響應(yīng)接口,在響應(yīng)后需要回調(diào)此接口
*/
public interface ResponseCallBack {
void onSuccess(String result);
void onError(Exception e);
}
}
3.在 Activity 中使用
private void request() {
SimpleArrayMap<String, Object> map = new SimpleArrayMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
WebServiceUtil.call("method name", map, new WebServiceUtil.ResponseCallBack() {
@Override
public void onSuccess(String result) {
// 請(qǐng)求成功
}
@Override
public void onError(Exception e) {
// 請(qǐng)求失敗
}
});
}
至此調(diào)用結(jié)束,有需要訪問(wèn) WebService 的同學(xué)可以參考一下。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 在Android中訪問(wèn)WebService接口的方法
- Android開(kāi)發(fā)調(diào)用WebService的方法示例
- Android ksoap調(diào)用webservice批量上傳多張圖片詳解
- Android 通過(guò)webservice上傳多張圖片到指定服務(wù)器詳解
- Android通過(guò)ksoap2傳遞復(fù)雜數(shù)據(jù)類(lèi)型及CXF發(fā)布的webservice詳細(xì)介紹
- 在Android中調(diào)用WebService實(shí)例
- Android通過(guò)Webservice操作sqlserver數(shù)據(jù)庫(kù)實(shí)例代碼
- android調(diào)用WebService實(shí)例分析
- android中soap協(xié)議使用(ksoap調(diào)用webservice)
- android調(diào)用webservice接口獲取信息
相關(guān)文章
Android編程實(shí)現(xiàn)號(hào)碼歸屬地查詢的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)號(hào)碼歸屬地查詢的方法,涉及Android xml文件的發(fā)送及WebService的操作技巧,需要的朋友可以參考下2016-01-01
利用Android中BitmapShader制作自帶邊框的圓形頭像
這篇文章給大家介紹了一下如何利用BitmapShader制作圓形頭像,可以自定義要顯示的圖片,邊框顏色和邊框?qū)挾鹊?,有需要的朋友們可以參考借鑒。2016-09-09
Android OpenGL入門(mén)之GLSurfaceView
這篇文章主要介紹了OpenGL入門(mén)知識(shí),如何在Android中使用GLSurfaceView,如果對(duì)OpenGL感興趣的同學(xué),可以參考下2021-04-04
Android使用ContentProvider實(shí)現(xiàn)查看系統(tǒng)短信功能
這篇文章主要為大家詳細(xì)介紹了Android使用ContentProvider實(shí)現(xiàn)查看系統(tǒng)短信功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Android開(kāi)發(fā)筆記XML數(shù)據(jù)解析方法及優(yōu)缺點(diǎn)
XML數(shù)據(jù)是一種常見(jiàn)的數(shù)據(jù)格式,Android開(kāi)發(fā)中需要對(duì)其進(jìn)行解析。常用的XML解析方式有DOM、SAX、Pull和Json等,每種方式都有其優(yōu)缺點(diǎn)。開(kāi)發(fā)者可以根據(jù)具體需求選擇合適的解析方式,提高數(shù)據(jù)解析效率和性能2023-05-05
Android LayoutTransiton實(shí)現(xiàn)簡(jiǎn)單的錄制按鈕
這篇文章主要介紹了Android LayoutTransiton實(shí)現(xiàn)簡(jiǎn)單的錄制按鈕,主要實(shí)現(xiàn)開(kāi)始,暫停,停止和顯示錄制時(shí)間長(zhǎng)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android:“萬(wàn)能”Activity重構(gòu)篇
本文主要介紹了mvp以及每一層,以及使用mvp來(lái)重構(gòu)“萬(wàn)能”Activity,其實(shí)每一層需要注意的東西還有很多,比如model層是最難寫(xiě)的一層。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
Android開(kāi)機(jī)自啟動(dòng)程序詳解
本篇文章是對(duì)Android開(kāi)機(jī)自啟動(dòng)程序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

