《android 解析WebService》

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

相關文章
相關標籤/搜索