OkHttp的封装

前言

前面一篇博客对OkHttp进行了简单的介绍https://blog.csdn.net/wen_haha/article/details/81040573 ,简单的介绍了一下OkHttp的get、post请求以及文件的上传和下载,但是每次请求网络都要写重复的代码就很麻烦,我们这篇博客就对OkHttp进行一下简单的封装,方便使用。

意义

封装的意义在于更加方便地使用,具有拓展性,但是对OkHttp进行封装需要解决的两点是:

1.避免重复代码调用

2.将请求结果回调改为UI线程。

如果想要使用OkHttp的开源库,可以使用OKHttpFinal(Github:https://github.com/pengjianbo/OkHttpFinal)。

封装

1.配置gradle

在AndroidStudio中使用不需要下载jar包,直接添加依赖即可: 

compile 'com.squareup.okhttp3:okhttp:3.10.0'

2.封装一个通用的请求创建类CommonRequest,负责创建各种类型的请求对象,包括get、post,上传文件类型。

①创建get请求

public static Request createGetRequest(String url, RequestParams params){
    StringBuilder urlBuilder = new StringBuilder();
    if(params != null){
        for(Map.Entry<String, String> entry : params.urlParams.entrySet()){
            urlBuilder.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue())
                    .append("&");
        }
    }
    int end = urlBuilder.length() - 1;
    String fullUrl = url + urlBuilder.substring(0, (end > 0 ? end : 0)).toString();
    return new Request.Builder()
            .url(fullUrl)
            .get()
            .build();
}

需要用到RequestParams参数类

public class RequestParams {
    public ConcurrentHashMap<String, String> urlParams = new ConcurrentHashMap<>();
    public ConcurrentHashMap<String, Object> fileParams = new ConcurrentHashMap<>();
    // TODO 构造函数
    public RequestParams(Map<String, Object> source) {
        if(source != null) {
            for (Map.Entry<String, Object> entry : source.entrySet()) {
                if(entry.getValue() instanceof File){
                    put(entry.getKey(), entry.getValue());
                }else{
                    put(entry.getKey(), (String) entry.getValue());
                }
            }
        }
    }
    private void put(String name, String value){
        if(name == null) return;
        urlParams.put(name, value);
    }
    private void put(String name, Object value){
        fileParams.put(name, value);
    }
}

②创建psot请求

 public static Request createPostRequest(String url, RequestParams params){
        FormBody.Builder builder = new FormBody.Builder();
        if(params != null){
            for(Map.Entry<String, String> entry : params.urlParams.entrySet()){
                builder.add(entry.getKey(), entry.getValue());
            }
        }
        FormBody body = builder.build();
        return new Request.Builder()
                .url(url)
                .post(body)
                .build();
    }

3.创建CommonOkHttpClient,用来发送get,post请求的工具类

①设置超时时间

  OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
        okHttpBuilder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });
        okHttpBuilder.connectTimeout(TIME_OUT, TimeUnit.SECONDS);
        okHttpBuilder.readTimeout(TIME_OUT, TimeUnit.SECONDS);
        okHttpBuilder.writeTimeout(TIME_OUT, TimeUnit.SECONDS);
        okHttpBuilder.followRedirects(true); // 允许自定项

②发送get请求

 public static void get(String url, RequestParams params, final DisposeDataHandler handler){
        try {
            Request request = CommonRequest.createGetRequest(url, params);
            Call call = okHttpClient.newCall(request);
            call.enqueue(new CommonJsonCallBack(handler));
        }catch (final Exception e){
            mDelieverHandler.post(new Runnable() {
                @Override
                public void run() {
                    handler.mListener.onFailure(e);
                }
            });
        }
    }

③发送post请求

public static void post(String url, RequestParams params, final DisposeDataHandler handler){
        try{
            Request request = CommonRequest.createPostRequest(url, params);
            Call call = okHttpClient.newCall(request);
            call.enqueue(new CommonJsonCallBack(handler));
        }catch (final Exception e){
            mDelieverHandler.post(new Runnable() {
                @Override
                public void run() {
                    handler.mListener.onFailure(e);
                }
            });
        }
    }

4.返回格式

我们这里返回Json数据,用fastJson进行解析。

 if(TextUtils.isEmpty(result)){
            notifyFailure(new OkHttpException(NETWORK_ERROR, EMPTY_MSG));
            return;
        }
        try {
            JSONObject obj = new JSONObject(result);
            if(obj.has(RESULT_CODE)){
                if(obj.optInt(RESULT_CODE) == RESULT_CODE_DUCCESS){
                    if(clazz == null){
                        notifySuccess(obj);
                    }else{
                        Object clazzObj = null;
                        try {
                            clazzObj = JSON.parseObject(result, clazz);
                            if(clazzObj == null) {
                                notifyFailure(new OkHttpException(JSON_ERROR, EMPTY_MSG));
                            }else{
                                // 所有逻辑正常,返回实体对象
                                notifySuccess(clazzObj);
                            }
                        }catch (Exception e){
                            notifyFailure(new OkHttpException(JSON_ERROR, EMPTY_MSG));
                        }
                    }
                }else{
                    notifyFailure(new OkHttpException(NETWORK_ERROR, EMPTY_MSG));
                }
            }else{
                notifyFailure(new OkHttpException(NETWORK_ERROR, EMPTY_MSG));
            }
        }catch (Exception e){
            if(e instanceof JSONException){
                notifySuccess(result);
            }else {
                notifyFailure(new OkHttpException(OTHER_ERROR, EMPTY_MSG));
            }
        }

5.调用get,post请求

①发送get请求

private void getRequest() {
        CommonOkHttpClient.get("https://www.imooc.com/video/13050",null,new DisposeDataHandler(new DisposeDataListener() {
            @Override
            public void onSuccess(Object responseObj) {
                mTvCookieShow.setText(responseObj.toString());
            }

            @Override
            public void onFailure(Object error) {
                mTvCookieShow.setText(error.toString());
            }
        }));
    }

②发送post请求

private void postRequest() {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("username", "jwj");
        paramMap.put("password", "123456");
        RequestParams params = new RequestParams(paramMap);
        CommonOkHttpClient.post("http://192.168.1.92:8080/OkHttpServer/login", params, new DisposeDataHandler(new DisposeDataListener() {
            @Override
            public void onSuccess(Object response) {
                mTvCookieShow.setText(response.toString());
            }

            @Override
            public void onFailure(Object error) {
                mTvCookieShow.setText(error.toString());
            }
        }));
    }

总结

经过封装后的OkHttp,减少了代码的冗余,提高了代码的可复用性,大大的减少了重复代码。

Demo

CSDN

https://download.csdn.net/download/wen_haha/10545569

Github

https://github.com/kongkongdaren/OkHttpEncapsulationDemo

猜你喜欢

转载自blog.csdn.net/wen_haha/article/details/81076495
今日推荐