Okhttp 简单的网络封装

              项目一直在用okhttp进行网络请求,但是一直没有自己独立敲一遍整个的网络请求框架。目的是重新了解整个框架的实现流程。

             框架实现的结果:

            1、请求参数统一封装;

            2、返回参数统一处理;

            3、此框架可以实现各个网络框架,比如okhttp,Volley等的迅速替换,而不需要替换框架,更改每个接口。


           


          一、请求接口

   

public interface ICallback {
    void onSuccess(String result);
    void onFailure(String e);
}

 数据均以String类型返回。



2、支持泛型的请求接口,实现ICallBack,在方法中直接进行Gson解析,返回需要的bean类。

public abstract  class HttpCallback<Result> implements ICallback{

    @Override
    public void onSuccess(String result) {
        Log.i("返回result",result.toString());
        Gson gson = new Gson();
        try{
            Result objResult = (Result)gson.fromJson(result,analysisClassInfo(this));
            onSuccess(objResult);
        }catch (Exception e){
            Log.e("返回数据Gson解析异常",e.toString());
            onFailure(e.toString());
        }
    }


    @Override
    public void onFailure(String e) {
        Log.e("请求onFailure==",e.toString());
        onFailure(e);

    }

    public abstract void onSuccess(Result result);

    public static Type analysisClassInfo(Object object) {
        Type genType = object.getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
        return  params[0];
    }


}



3、请求方法的接口,


public interface IHttpProcessor {


    /**
     * 异步post请求
     */
    void post(String url, Map<String, Object> params, ICallback callback);

    /**
     * 异步get请求
     */
    void get(String url, Map<String, Object> params, ICallback callback);

    /**
     * 同步post请求
     */
    void postSyn(String url, Map<String, Object> params, ICallback callback);

    /**
     * 同步get请求
     */
    void getSyn(String url, Map<String, Object> params, ICallback callback);
}



4、实现请求接口的类,如果项目中需要用okhttp,则可以写OkhttpProcessor,如果需要用Volley,则可以写VolleyProcessor。


public class OkhttpProcessor implements IHttpProcessor {


    private static final String TAG = "OkhttpProcessor";
    private OkHttpClient mOkHttpClient;
    private Handler mHandler;


    public OkhttpProcessor() {
        mOkHttpClient = new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)//设置连接超时时间
                .writeTimeout(30, TimeUnit.SECONDS)//设置写的超时时间
                .readTimeout(30, TimeUnit.SECONDS)//设置读取超时时间
                .build();

        mHandler = new Handler();
    }

    /**
     * 异步post
     */

    @Override
    public void post(String url, Map<String, Object> params, final ICallback callback) {
        RequestBody requestBody = appendBody(params);
        Request request = addHeaders().url(url).post(requestBody).build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(final Call call, final IOException e) {
                failedCallBack(e.toString(), callback);
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                responseCallBack(response, callback);
            }
        });
    }

    /**
     * 异步get
     */
    @Override
    public void get(String url, Map<String, Object> params, final ICallback callback) {
        Request request = addHeaders().url(url).build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(final Call call, final IOException e) {
                failedCallBack(e.toString(), callback);

            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                responseCallBack(response, callback);

            }
        });
    }


    /**
     * 同步post
     */

    @Override
    public void postSyn(String url, Map<String, Object> params, ICallback callback) {
        try {
            RequestBody requestBody = appendBody(params);
            Request request = addHeaders().url(url).post(requestBody).build();
            Response response = mOkHttpClient.newCall(request).execute();
            responseCallBack(response, callback);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 同步get
     */
    @Override
    public void getSyn(String url, Map<String, Object> params, ICallback callback) {
        try {
            Request request = addHeaders().url(url).build();
            Response response = mOkHttpClient.newCall(request).execute();
            responseCallBack(response, callback);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }



    //==========================================内部方法============================================================

    /**
     * 统一为请求添加头信息
     *
     * @return
     */
    private Request.Builder addHeaders() {
        Request.Builder builder = new Request.Builder();
//                .addHeader("", "")
        return builder;
    }


    /**
     * 统一处理onResponse信息
     */
    private void responseCallBack(Response response, final ICallback callBack) throws IOException {
        Log.i("接口返回response:", response + "");
        final String result = response.body().string();
        if (response.isSuccessful()) {
            successCallBack(result, callBack);
        } else {
            failedCallBack(response.toString(), callBack);
        }

    }


    /**
     * 统一处理成功信息
     */
    private void successCallBack(final String result, final ICallback callBack) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if (callBack != null) {
                    callBack.onSuccess(result);
                }
            }
        });
    }

    /**
     * 统一处理失败信息
     */

    private void failedCallBack(final String errorMsg, final ICallback callBack) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if (callBack != null) {
                    callBack.onFailure(errorMsg);
                }
            }
        });
    }


    /**
     * 获取RequestBody
     */
    private RequestBody appendBody(Map<String, Object> params) {
        FormBody.Builder body = new FormBody.Builder();
        if (params == null || params.isEmpty()) {
            return body.build();
        }
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            Log.i("接口请求参数:", entry.getKey() + ":" + entry.getValue().toString());
            body.add(entry.getKey(), entry.getValue().toString());
        }
        return body.build();
    }


}


以上即为简单的网络框架,那怎么使用这个框架:


5、在Application里面对框架进行初始化:

HttpHelper.init(new OkhttpProcessor());


6、具体代码使用:

因为返回的格式是统一格式,所以用泛型替代。如果返回的msg是object类,那在下面标注红色的地方,直接为ResponseBean<bean类名称>,如果返回msg为数组,则泛型为ResponseBean<List<bean类名称>。



private Map<String,Object> httpParams = new HashMap<>();
    public void getlistData(){
        httpParams.put("a", "aa");
        httpParams.put("b","bb");
        httpParams.put("c","cc");
        HttpHelper.obtain().post(HttpUrlUtil.GET_PERFORMANCE_FM, httpParams, new HttpCallback<ResponseBean<List<FMAchievementBean>>>() {
            @Override
            public void onSuccess(ResponseBean responseBean) {
                //处理数据
            }

            @Override
            public void onFailure(String e) {
                //处理数据
            }
        });
    }


7、返回数据格式:

ResponseBean类:

public class ResponseBean<T> implements Serializable{
    public String status;
    public String error;
    public T msg;
}

github源码地址







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值