webService,soap,wsdl的基本概念?

详情请看维基百科

基于soap 1.1, soap 1.2 的请求和响应数据源

查找了很久都是基于json格式传输数据,但是最终还是找到了基于xml webservice的接口 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx,里面提供了一些省市天气查询,国家名称以及对应id查询等。

ksoap2 调用WebService

1:要在android上调用,我们首先下载ksoap2-android jar包,丢到lib包下,添加依赖

2:接着我们提取出一个请求的工具类SoapConfig,SoapConfig 的全部代码如下

import org.ksoap2.HeaderProperty;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import java.util.ArrayList;
import java.util.Map;
import java.util.Set;

import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import issue.cn.net.wanji.issueneimeng.network.ApiService;

public class SoapConfig {
    public static final String WEB_SERVER_URL = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx";
    public static volatile HttpTransportSE httpTransportSE = null;
    public static volatile SoapSerializationEnvelope envelope = null;
    public static SoapObject soapObject = null;


    // 命名空间
    public static final String NAME_SPACE = "http://webservice.eisi.hgsoft.com";

    public static final String NAME = "EISIService";


    public static HttpTransportSE getHttpTransportSE() {
        if (httpTransportSE == null) {
            httpTransportSE = new HttpTransportSE(ApiService.URL);
        }
        return httpTransportSE;
    }


    public static SoapObject getSoapObject() {
        soapObject = null;
        soapObject = new SoapObject(NAME_SPACE, NAME);
        return soapObject;
    }

    public static Single sendData(Map<String, Object> queryParamsMap, Map<String, Object> headerParamsMap) {
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
        SoapObject request = getSoapObject();

        //添加请求参数
        if (queryParamsMap != null && queryParamsMap.size() > 0) {
            Set<String> keys = queryParamsMap.keySet();
            for (String queryKey : keys) {
                Logger.i("参数");
                Logger.i(queryKey + ":" + queryParamsMap.get(queryKey));
                request.addProperty(queryKey, queryParamsMap.get(queryKey));
            }
        }
        envelope.bodyOut = request;
        return Single.create(emitter -> {
            SoapConfig.getHttpTransportSE().call(null, envelope, addHeadProperty(headerParamsMap));
            if (envelope.getResponse() != null) {
                emitter.onSuccess(envelope);
            } else {
                emitter.onError(new Throwable("请求失败"));
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }


    /**
     * 添加头部请求参数
     *
     * @param headerParamsMap
     * @return
     */

    public static ArrayList<HeaderProperty> addHeadProperty(Map<String, Object> headerParamsMap) {
        ArrayList<HeaderProperty> headerProperty = new ArrayList<>();
        //添加head参数
        if (headerParamsMap != null && headerParamsMap.size() > 0) {
            Set<String> keys = headerParamsMap.keySet();
            for (String headerKey : keys) {
                Logger.i("参数");
                Logger.i(headerKey + ":" + headerParamsMap.get(headerKey));
//                request.addProperty(headerKey, headerParamsMap.get(headerKey));
                headerProperty.add(new HeaderProperty(headerKey, (String) headerParamsMap.get(headerKey)));

            }
        }
        return headerProperty;
    }


}

3:我们在ViewModel中调用请求

        Map<String, Object> headParamsMap = new HashMap<>();
        headParamsMap.put("XXX","XXX");
        headParamsMap.put("XXX","XXX");
        headParamsMap.put("XXX","XXX");
        headParamsMap.put("XXX","XXX");
        headParamsMap.put("XXX","XXX");
        
       
        Map<String, Object> queryParamsMap = new HashMap<>();
        queryParamsMap.put("XXX","XXX");
        queryParamsMap.put("XXX","XXX");
        queryParamsMap.put("XXX","XXX");
        queryParamsMap.put("XXX","XXX");


        homeResource.searchCusEvent(queryParamsMap, headParamsMap).subscribe(new SingleObserver() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onSuccess(Object o) {
                SoapSerializationEnvelope envelope = (SoapSerializationEnvelope) o;
                //服务器返回的结果
                Logger.i(envelope.getResponse());
            }

            @Override
            public void onError(Throwable e) {
                Logger.i(e.getMessage());
            }
        });
        
        

   public Single searchCusEvent(Map<String, Object> queryParamsMap, Map<String, Object> headerParamsMap) {
        return SoapConfig.sendData(queryParamsMap, headerParamsMap);
    }

 4 解析请求WebService返回SoapObject 数据解析,我们可以按照约定的格式解析,虽然不太方便,但是暂时也没找到更好的资料或研究出更好的方法

try {
                    SoapSerializationEnvelope envelope = (SoapSerializationEnvelope) o;
                    Object ob = envelope.bodyIn;
                    SoapObject soapObject = (SoapObject) envelope.getResponse();
                    SoapObject str = (SoapObject) soapObject.getProperty(0);
                    SoapObject st1 = (SoapObject) soapObject.getProperty(1);
                    SoapObject str2 = (SoapObject) st1.getProperty(0);
                    List<SimpleType> lists = new ArrayList<>();


                    for (int i = 0; i < str2.getPropertyCount(); i++) {
                        SoapObject soapObject1 = (SoapObject) str2.getProperty(i);
                        lists.add(new SimpleType(Integer.parseInt(soapObject1.getPropertyAsString("RegionID")), soapObject1.getPropertyAsString("RegionName")));
                    }
                    Logger.d(String.valueOf(lists.size()));
                } catch (SoapFault soapFault) {
                    soapFault.printStackTrace();
                }