Android中使用Soap協議

以下是根據自己項目做得簡單封裝,作爲自己的筆記,僅供參考

1.libs中添加jar包

ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar

2.app build.gradle中添加

androidTestImplementation files('libs/ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar')

自己做的簡單封裝

3.HttpSoapUtils

package zz.bole.bl_pl_qsjh.utils;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

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.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.Map;

import zz.bole.bl_pl_qsjh.R;
import zz.bole.bl_pl_qsjh.retrofit.NetworkUtil;

public class HttpSoapUtils {

    public static  void   sendPostRequest(String methodName, String endPointurl, String soapActionurl, Map<String, String> mapParams, final ResultHandler resultHandler) {
        // 判斷網絡連接狀況
        if (resultHandler.isNetDisconnected()) {
            resultHandler.onAfterFailure();
            return ;
        }
        resultHandler.onBeforeResult();
        //空間名字,和服務器地址一致
        String nameSpace = "http://tempuri.org/";
        //建立soapheader,用header傳UserName和PassWord
        Element[] header = new Element[1];
        header[0] = new Element().createElement(nameSpace, "CredentialSoapHeader");
        Element uname = new Element().createElement(nameSpace, "UserName");
        uname.addChild(Node.TEXT, "test");//<UserName>xxx</UserName>
        header[0].addChild(Node.ELEMENT, uname);

        Element pass = new Element().createElement(nameSpace, "Password");
        pass.addChild(Node.TEXT, "123");//<Password>xxx</Password>
        header[0].addChild(Node.ELEMENT, pass);

        SoapObject so = new SoapObject(nameSpace, methodName);
        for (String key : mapParams.keySet()) {
            so.addProperty(key, mapParams.get(key));
        }
        SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER12);
        envelope.headerOut=header;
        envelope.bodyOut=so;
        envelope.dotNet=true;
        envelope.setOutputSoapObject(so);
        HttpTransportSE transport=new HttpTransportSE(endPointurl);
        try {
            transport.call(soapActionurl, envelope);// 調用WebService

        } catch (Exception e) {
            e.printStackTrace();
        }
        SoapObject object=(SoapObject)envelope.bodyIn;// 獲取返回的數據

        if (object == null) {
            resultHandler.onServerError();
            return;
        }

        String string = object.getProperty(0).toString();
        resultHandler.onResult(string);



    }

    /**
     * 網絡請求結果處理類
     *
     */
    public static abstract class ResultHandler{
        Context context;

        public ResultHandler(Context context) {
            this.context = context;
        }

        /**
         * 判斷網絡是否未連接
         *
         * @return
         */
        public boolean isNetDisconnected() {
            return NetworkUtil.isNetDisconnected(context);
        }

        /**
         * 請求成功之前
         */
        public abstract void onBeforeResult();

        /**
         * 請求成功時
         *
         * @param t 結果數據
         */
        public abstract void onResult(String t);

        /**
         * 服務器出錯
         */
        public void onServerError() {
            // 服務器處理出錯
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(context, R.string.net_server_error, Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }).start();

        }

        /**
         * 請求失敗後的處理
         */
        public abstract void onAfterFailure();

        /**
         * 請求失敗時的處理
         *
         * @param t
         */
        public void onFailure(Throwable t) {
            if (t instanceof SocketTimeoutException || t instanceof ConnectException) {
                // 連接異常
                if (NetworkUtil.isNetworkConnected(context)) {
                    // 服務器連接出錯
                    Toast.makeText(context, R.string.net_server_connected_error, Toast.LENGTH_SHORT).show();
                } else {
                    // 手機網絡不通
                    Toast.makeText(context, R.string.net_not_connected, Toast.LENGTH_SHORT).show();
                }
            } else if (t instanceof Exception) {
                // 功能異常
                Toast.makeText(context, R.string.net_unknown_error, Toast.LENGTH_SHORT).show();
            }
        }
    }

}

 

4.手機網絡監測工具

NetworkUtil
package zz.bole.bl_pl_qsjh.retrofit;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

import zz.bole.bl_pl_qsjh.R;

/**
 * 手機網絡監測工具
 */

public class NetworkUtil {
    /**
     * 檢測網絡連接狀態
     *
     * @param context
     * @return
     */
    public static boolean isNetworkConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null) {
                return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    /**
     * 網絡是否未連接
     * <p>未連接時給出提示</p>
     *
     * @param context
     * @return boolean 是否連接網絡
     */
    public static boolean isNetDisconnected(Context context) {
        if (!isNetworkConnected(context)) {
            toastTest(context);
            return true;
        }
        return false;
    }


    private static void toastTest(final Context context) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, R.string.net_not_connected, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }).start();
    }

    /**
     * 判斷用戶是否連接在wifi下
     *
     * @param context
     * @return
     */
    public static boolean isConnectedByWifi(Context context) {
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
        if (networkInfo != null) {
            return networkInfo.getType() == ConnectivityManager.TYPE_WIFI ? true : false;
        }
        return false;
    }

}

 

5.Activity代碼具體使用

new Thread(new Runnable() {
                @Override
                public void run() {
                    
                }
            }).start();

以下需要在子線程中使用

HashMap<String, String> hashMap = new HashMap<>();

hashMap.put("code",username);

hashMap.put("password",pwd);

String methodName = "Login";

String endPointurl = urladdress+Urls.BASE_URL; //http://192.168.200.12:8001/TESTService.asmx

String soapActionurl = urladdress+Urls.LOGIN; //http://192.168.200.12:8001/TESTService.asmx/Login

 

HttpSoapUtils.sendPostRequest(methodName, endPointurl, soapActionurl, hashMap, new HttpSoapUtils.ResultHandler(mContext) {

@Override

public void onBeforeResult() {

 

}

 

@Override

public void onResult(String t) {

//對字符串解析操作

}

 

@Override

public void onAfterFailure() {

 

}

});

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章