关于WebServices的一般用法

关于WebServices的一般用法

本文以TestWebServices做例子,其内部方法的封装则大同小异,因此留下作为参考(适用Android和WebServices的通讯)


废话不多说,直接上代码吧,在代码中注释比较容易观看


public class TestWebServices{

    private static final String TAG = TestWebServices.class.getSimpleName();

    //先定义几个必须的常量
    private static final String state_success = "1";//登陆成功
    private static final String state_failuer = "2";//登陆失败
    private static final String state_noimage = "3";//失败、无图片
    protected static final int STATE_SUCCESS = 1;//登陆成功
    protected static final int STATE_FAILURE = 2;//失败 ,帐号不存在
    protected static final int STATE_NOIMAGE = 3;//图片不存在


    protected static final String mDetailSplitRegular = ",";
    protected static final String mDefaultCharacterEncode = "UTF-8";
    protected static final int mDefaultBase64Encode = Base64.DEFAULT;

    private static String WSDL_URL = "";
    protected static String NAME_SPACE = "";
    private static String mWsdlUrl = "";


    public static HashMap<String, Integer> resultCodeMap = new HashMap<String, Integer>();

    static {
        resultCodeMap.put(state_success, STATE_SUCCESS);
        resultCodeMap.put(state_failuer, STATE_FAILURE);
        resultCodeMap.put(state_noimage, STATE_NOIMAGE);
    }


    /**
     * 呼叫Webservice(无参数),若呼叫无错误返回,则调用getResponeData()获取返回数据。
     * @param method 呼叫的函数名
     */
    protected Object callServer(String method) {
        return call(method);
    }



    /**
     * 通过protected Object callServer(String method)方法
     * 调用,保护内在方法(封装,不懂的话对比getter和setter)
     * @param method
     * @return Object
     */
    private final Object call(String method) {
        //调用SoapObject 协议
        SoapObject soapObject = new SoapObject(getNameSpace(), method);
        //创建WebServices对象请求体
        WebServicesRequest request = new WebServicesRequest();
        request.setSoapObject(soapObject);
        request.setWsdl(getWsdlUrl());
        request.setNameSpace(getNameSpace());
        request.setMethod(method);
        return execute(request);
    }


    /**
     * 配置呼叫内容
     * (注意,该方法为通用方法,用于通讯用的方法)
     * @param method 呼叫的函数名
     * @param params 参数集合 参数Map的内容: Stringkey1 形参名1 -- value 数据 Stringkey2 形参名2 --
     * value 数据 Stringkey3 形参名3 -- value 数据 ...
     * @return
     */
    protected Object callServer(String method, Map<String, Object> params) {
        SoapObject soapObject = new SoapObject(getNameSpace(), method);
        if (params != null && params.size() > 0) {
            Map<String, Object> paramsValueMap = new HashMap<String, Object>(params);
            Set<String> keySet = paramsValueMap.keySet();
            for (String key : keySet) {
                Object contentObject = paramsValueMap.get(key);
                soapObject.addProperty(key, contentObject);
            }
        }
        WebServicesRequest request = new WebServicesRequest();
        request.setMethod(method);
        request.setWsdl(getWsdlUrl());
        request.setNameSpace(getNameSpace());
        request.setSoapObject(soapObject);
        return execute(request);
    }



    /**
     * 请求数据
     * execute()提交请求方法
     */
    //供选择的值有:VER10,VER11,VER12;分别代表SOAP1.0,SOAP1.1,SOAP1.2版本协议,此处使用SOAP1.1
    private final WebServicesRespone execute(WebServicesRequest request) {
        if (!TextUtils.isEmpty(request.getMethod())) {
            SoapObject soapObject = request.getSoapObject();
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(VER11);
            envelope.bodyOut = soapObject;
            envelope.dotNet = true;
            envelope.setOutputSoapObject(soapObject);
            HttpTransportSE transportSE = new HttpTransportSE(request.getWsdl());
            WebServicesRespone respone = new WebServicesRespone();
            String action = request.getNameSpace() + request.getMethod();
            try {
                //呼叫WebService(正式呼叫)
                transportSE.call(action, envelope);
                //呼叫网络得到的数据
                Object retData = envelope.getResponse();
                respone.setValue(retData);
                respone.setResult(STATE_SUCCESS);

            } catch (IOException e) {
                e.printStackTrace();
                respone.setResult(STATE_FAILURE);
                respone.setDesc(e.getMessage());
            } catch (XmlPullParserException e) {
                e.printStackTrace();
                respone.setResult(STATE_FAILURE);
                respone.setDesc(e.getMessage());
            }
            return respone;
        }
        return null;
    }



    /**
     *   设置服务器地址
     */
    public static String setWsdlUrl(String url) {
        if (TextUtils.isEmpty(url)) {
            return "";
        }

        String tmpUrl = url;

        if (!tmpUrl.startsWith("http://")) {
            tmpUrl = "http://" + tmpUrl;
        }
        if (tmpUrl.endsWith("/")) {
        //Constants.AUTHORIZE_WEBSERVICES为自定义常量参数,存放于Constants类中,便于管理(比如你将 AUTHORIZE_WEBSERVICES = baidu.com,下次你想让服务器请求地址变成360.com时,只需AUTHORIZE_WEBSERVICES = 360.com)以下几个同理
            tmpUrl = tmpUrl + Constants.AUTHORIZE_WEBSERVICES;
        }
        if (!tmpUrl.endsWith("/" + Constants.AUTHORIZE_WEBSERVICES)) {
            tmpUrl = tmpUrl + "/" + Constants.AUTHORIZE_WEBSERVICES;
        }

        mWsdlUrl = tmpUrl;
        setWsdl(mWsdlUrl);
        setNamespace(Constants.AUTHORIZE_NAMESPACE);

        return mWsdlUrl;
    }

    //设置WSDL_URL地址
    protected final static String setWsdl(String wsdl) {
        WSDL_URL = wsdl;
        return WSDL_URL;
    }

    //设置 空格
    protected final static String setNamespace(String namespace) {
        NAME_SPACE = namespace;
        return NAME_SPACE;
    }

    protected static String getWsdlUrl() {
        return WSDL_URL;
    }

    protected static String getNameSpace() {
        return NAME_SPACE;
    }

}

如果下次需要再使用到,只需令XXXWebServices extends TestWebServices,然后依样画葫芦就行啦,再来一个类:

public class XxxWebServices extends FarmWebServices {
    private static final String TAG = XxxWebServices .class.getSimpleName();

    public static final int STATE_SUCCESS = 1;//成功
    public static final int STATE_FAILURE = 2;//失败
    public static final int STATE_USER_ERROR = 10;//失败 ,帐号不存在
    public static final int STATE_NOIMAGE = 3;//图片不存在
    public static final String STATE_DELETE_FAIL = "0";// 删除服务器失败

    /**
     * 校验
     */
    protected static String PTOKEN_KEY = "pToken";
    protected static String PTOKEN_VALUE = "md5(omsiden16)";

    /**
     * 删除选中记录
     */
//    protected static String PTOKEN_KEY = "pToken";
//    protected static String PTOKEN_VALUE = "md5(omsiden16)";
    protected static String PIDLIST_KEY = "pIDList";//被删除的数据

    /**
     * 帐号验证
     */
    private static final String USERCODE = "pUserCode";
    private static final String PSSSWORD = "pPassword";



    /**
     * 接口
     */
    private static final String Method_GETUSERLOGIN = "WebLogin";
    private static final String Method_DELETERECORDS = "DeleteWeightRecords";
    private static final String Method_GetUserList = "GetUserList";
    private static final String Method_GetFruitRecords = "GetWeightRecords";

    /**
     * 登陆成功JSON的KEY
     */
    private static final String KEY_USER_NAME = "username";
    private static final String KEY_MANAGER = "manager";
    private static final String KEY_RESULT = "result";
    private static final String KEY_MSG = "msg";

    /**
     * 唯一实例
     */
    private static Object mSyncLock = new Object();
    private static XxxWebServices mInstance;

    public static XxxWebServices getInstance() {
        synchronized (mSyncLock) {
            if (mInstance == null) {
                mInstance = new XxxWebServices ();

            }
            return mInstance;
        }
    }


    /**
     * 验证帐号登录
     */
    public WebServicesRespone userLogin(String pUserCode, String pPassWord) {
        HashMap<String, Object> parms = new HashMap<>();
        parms.put(PTOKEN_KEY, PTOKEN_VALUE);
        parms.put(USERCODE, pUserCode);
        parms.put(PSSSWORD, pPassWord);

        try {
            WebServicesRespone result = (WebServicesRespone) callServer(Method_GETUSERLOGIN, parms);
            if (result != null && result.getResult() == STATE_SUCCESS) {
                String data = result.getValue().toString();
                if (!TextUtils.isEmpty(data)) {
                    UserLoginInfo info = new UserLoginInfo();
//                    Gson gson = new Gson();
//                    UserLoginInfo info = gson.fromJson(data, new TypeToken<UserLoginInfo>() {
//                    }.getType());
                    JSONObject jsonObject = new JSONObject(data);
                    info.setUsername(jsonObject.getString(KEY_USER_NAME));
                    info.setManager(jsonObject.getString(KEY_MANAGER));
                    info.setResult(jsonObject.getString(KEY_RESULT));
                    info.setMsg(jsonObject.getString(KEY_MSG));

                    result.setValue(info);
                    return result;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        WebServicesRespone respone = new WebServicesRespone();
        return respone;

    }



    /**
     * 删除记录
     */
    public String DeleteRecords(String pIDList) {
        HashMap<String, Object> parms = new HashMap<>();
        parms.put(PTOKEN_KEY, PTOKEN_VALUE);
        parms.put(PIDLIST_KEY, pIDList);
        try {
            WebServicesRespone result = (WebServicesRespone) callServer(Method_DELETERECORDS, parms);
            if (result != null && result.getResult() == STATE_SUCCESS) {
                String data = result.getValue().toString();
                if (!TextUtils.isEmpty(data)) {
                    return data;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return STATE_DELETE_FAIL;
    }
}

那上面 DeleteRecords这个方法来说明一下(固定写法,可完全模仿):

// DeleteRecords 为app和web端通讯的接口方法
// String 为返回值,在我原文中定义为:删除成功返回1,失败返回0
// String pIDList 为该删除方法传过来,需要删除的一连串数据
public String DeleteRecords(String pIDList)
// 先定义个HashMap,用于存储参数,然后用parms表示
// parms.put(PTOKEN_KEY, PTOKEN_VALUE)和parms.put(PIDLIST_KEY, pIDList)即为需要传的两个参数(当然,你如果有更多参数,那就继续put就行)。
HashMap<String, Object> parms = new HashMap<>();
        parms.put(PTOKEN_KEY, PTOKEN_VALUE);
        parms.put(PIDLIST_KEY, pIDList);
// 声明请求体 WebServicesRespone ,用于和web端通讯,callServer方法为第一个类内部写的方法,不懂请回看!
// callServer(Method_DELETERECORDS, parms),将方法名和参数一起捆绑在请求体中,让 WebServicesRespone 帮你干活,具体怎么干,就封装在callServer(xxx,xxx)这个方法里面

WebServicesRespone result = (WebServicesRespone) callServer(Method_DELETERECORDS, parms);
// 逻辑业务,也是死方法,不懂没关系,照写就是
// 注意:!TextUtils.isEmpty(data)其实是相当对data进行两个判断,即data != null && data != ""

if (result != null && result.getResult() == STATE_SUCCESS) {
                String data = result.getValue().toString();
                if (!TextUtils.isEmpty(data)) {

                    //注意,如果需从web端下载数据,请在这里面写逻辑业务

                    return data;
                }
            }

今天就写到这了,希望能帮到一些人。以上内容或许不够完美,请各路大神指教和改正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值