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() {
}
});