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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OkHttp是一个开源的HTTP客户端库,它封装了平台之间的差异性,为我们提供了方便的接口来发送HTTP请求和处理响应。当我们使用OkHttp时,可以使用封装类来简化使用过程。 OkHttp封装类主要包括以下几个方面: 1. 初始化OkHttpClient:首先,我们需要创建一个OkHttpClient对象,用于发送HTTP请求。在封装类中,可以在构造方法中进行OkHttpClient的初始化设置,比如设置超时时间、添加拦截器等。 2. 发送GET请求:通过封装类,我们可以定义一个方法来发送GET请求。该方法接收一个URL作为参数,使用OkHttpClient来创建一个Request对象,并通过该对象发送异步的GET请求。在回调中处理服务器响应结果,并返回给调用者。 3. 发送POST请求:类似于GET请求,我们可以封装一个方法来发送POST请求。该方法接收一个URL和需要发送的数据作为参数,使用OkHttpClient创建一个RequestBody对象,并通过该对象发送异步的POST请求。同样,在回调中处理响应结果,并返回给调用者。 4. 添加请求头:在某些情况下,我们可能需要添加请求头来发送自定义的信息。封装类可以提供一个方法,接收一个字符串类型的键值对参数,用于添加自定义的请求头。 5. 异步请求:OkHttp的请求是异步执行的,默认情况下在子线程中发送请求并在主线程中处理结果。封装类可以将异步请求的结果通过回调的方式返回给调用者,方便处理响应结果。 通过封装类,我们可以将OkHttp的使用变得更简单、更便捷。可以将一些通用的处理逻辑提取出来,在封装类中进行统一处理,并对外提供更友好的接口。这样可以减少代码的重复性,提高开发效率。同时,封装类还可以对请求进行统一的异常处理、日志打印等操作,方便排查问题和调试。总之,OkHttp封装类可以让我们更好地利用OkHttp的强大功能,提升开发效率和代码可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值