android端解析WebService我採用的是ksoap來完成的。ksoap相對來講也是比較簡單的。代碼以下java
package com.lv.test; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import org.kxml2.kdom.Element; import org.kxml2.kdom.Node; import java.util.Map; public class WebServiceUtil { private Boolean _isdotnet = false; /* * 設置當前WebServices是否支持 .net 的WebServices; * @param dotNetWebService: .net默認true;java默認是false */ public WebServiceUtil setIsDotNet(boolean dotNetWebService) { _isdotnet = dotNetWebService; return this; } private int _setHttpTimeOut = 10 * 1000; /* * 設置HTTP請求的時間,單位:秒; * @param secondTime: 默認 10 s */ public WebServiceUtil setHttpTimeOut(int secondTime) { _setHttpTimeOut = secondTime; return this; } private boolean _isdebug = false; /* * 設置啓用HTTP的Debug模式 * @param isdebug: 默認 false */ public WebServiceUtil setIsDebug(boolean isdebug) { _isdebug = isdebug; return this; } /* * 獲取WebService數據,並以字符形式返回。 * @param Url: WebService服務地址 (http://webservice.***.com.cn/WeatherWS.asmx) * @param NameSpace: WebService的服務的命名空間,能夠WSDL數據中找到 (http://***.com.cn/) * @param MethodName: WebService的調用函數方法名稱(getDataMethod) * @param Maps: 請求服務須要提交的數據集 * @Return: 服務以字符類型返回請求數據 * @Exception: 寫入控制檯日誌 */ public String getString(String Url, String NameSpace, String MethodName, Map<String, ?> RequestDatas) { return getString(Url, NameSpace, MethodName, RequestDatas, null, null); } /* * 獲取WebService數據,並以字符形式返回。 * @param Url: WebService服務地址 (http://webservice.***.com.cn/WeatherWS.asmx) * @param NameSpace: WebService的服務的命名空間,能夠WSDL數據中找到 (http://***.com.cn/) * @param MethodName: WebService的調用函數方法名稱(getDataMethod) * @param Maps: 請求服務須要提交的數據集 * @Return: 服務以字符類型返回請求數據 * @Exception: 寫入控制檯日誌 */ public String getString(String Url, String NameSpace, String MethodName) { return getString(Url, NameSpace, MethodName, null, null, null); } /* * 獲取WebService數據,並以字符形式返回。 * @param Url: WebService服務地址 (http://webservice.***.com.cn/WeatherWS.asmx) * @param NameSpace: WebService的服務的命名空間,能夠WSDL數據中找到 (http://***.com.cn/) * @param MethodName: WebService的調用函數方法名稱(getDataMethod) * @param Maps: 請求服務須要提交的數據集 * @param SoapHeadeName: 設置WebService的HTTP頭名稱 * @param SoapHeadeValues: 設置 SoapHeade 的數據集 * @Return: 服務以字符類型返回請求數據 * @Exception: 寫入控制檯日誌 */ public String getString(String Url, String NameSpace, String MethodName, Map<String, ?> RequestDatas, String SoapHeadeName, Map<String, ?> SoapHeadeValues) { SoapObject soap = getObject(Url, NameSpace, MethodName, RequestDatas, SoapHeadeName, SoapHeadeValues); if (soap != null && soap.getPropertyCount() > 0) { String getResultString = soap.getProperty(0).toString(); return getResultString; } return null; } /* * 獲取WebService數據,返回SoapObject對象。 * @param Url: WebService服務地址 (http://webservice.***.com.cn/WeatherWS.asmx) * @param NameSpace: WebService的服務的命名空間,能夠WSDL數據中找到 (http://***.com.cn/) * @param MethodName: WebService的調用函數方法名稱(getDataMethod) * @param Maps: 請求服務須要提交的數據集 * @Return: 服務返回SoapObject對象 * @Exception: 寫入控制檯日誌 */ public SoapObject getObject(String Url, String NameSpace, String MethodName, Map<String, Object> RequestDatas) { return getObject(Url, NameSpace, MethodName, RequestDatas, null, null); } /* * 獲取WebService數據,返回SoapObject對象。 * @param Url: WebService服務地址 (http://webservice.***.com.cn/WeatherWS.asmx) * @param NameSpace: WebService的服務的命名空間,能夠WSDL數據中找到 (http://***.com.cn/) * @param MethodName: WebService的調用函數方法名稱(getDataMethod) * @param Maps: 請求服務須要提交的數據集 * @param SoapHeadeName: 設置WebService的HTTP頭名稱 * @param SoapHeadeValues: 設置 SoapHeade 的數據集 * @Return: 服務返回SoapObject對象 * @Exception: 寫入控制檯日誌 */ public SoapObject getObject(String Url, String NameSpace, String MethodName, Map<String, ?> RequestDatas, String SoapHeadeName, Map<String, ?> SoapHeadeValues) { try { SoapObject soap = new SoapObject(NameSpace, MethodName); // 設置WebService提交的數據集 if (RequestDatas != null && !RequestDatas.isEmpty()) { for (Map.Entry<String, ?> entry : RequestDatas.entrySet()) { soap.addProperty(entry.getKey(), entry.getValue()); } } // 設置HTTP頭信息 Element[] header = null; if (SoapHeadeName != null && SoapHeadeValues != null && !SoapHeadeValues.isEmpty()) { header = new Element[1]; header[0] = new Element().createElement(NameSpace, SoapHeadeName); for (Map.Entry<String, ?> entry : SoapHeadeValues.entrySet()) { Element element = new Element().createElement(NameSpace, entry.getKey()); element.addChild(Node.TEXT, entry.getValue()); header[0].addChild(Node.ELEMENT, element); } } // 初始化數據請求 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = _isdotnet; if (header != null) envelope.headerOut = header; envelope.bodyOut = soap; envelope.setOutputSoapObject(soap); // 發起Web請求 HttpTransportSE http = new HttpTransportSE(Url, _setHttpTimeOut); http.debug = _isdebug; http.call(NameSpace + MethodName, envelope); // 獲取Web請求結果, 數據須要從 result.getProperty(0) 獲取 SoapObject result = (SoapObject) envelope.bodyIn; return result; } catch (Exception e) { e.getMessage(); } return null; } }
第一個坑:android
SoapSerializationEnvelope 在設置dotNet的時候要注意web
/* * 設置當前WebServices是否支持 .net 的WebServices; * @param dotNetWebService: .net默認true;java默認是false */
文章中也有提到dom
第二個坑:函數
就是傳遞參數。在工具類中咱們也看到了我把參數寫成了Map集合而後來完成填充。可是問題就出如今這裏,我若是使用ArrayMap或者HashMap的話,有部分值傳遞到後臺會丟失,因此參數的Map須要是LinkedHashMap最好工具
回調部分就沒寫了,有興趣的朋友能夠本身進一步封裝this