美文网首页
封装自己的OkHttp

封装自己的OkHttp

作者: 三年级一班亚索 | 来源:发表于2018-11-29 21:18 被阅读12次

    OkHttp:是Square公司的一款开源的网络请求库。它是一个高效的HTTP客户端,不过,每一次发一个请求都要写很多重复的代码,而且,如果不对其封装,如果其框架更改了一些方法,我们就得在我们自己的项目的每一处都得修改,所以为了方便使用和代码的质量,我们应该学会如何封装自己的OkHttp。

    如果你还不会使用OkHttp,可以去官网去查看一下教程,或者去搜索这方面的博客。本篇章主要介绍

    • 封装request
    • 封装

    封装request

    首先我们来看一下使用OkHttp正常发送一个get请求

    OkHttpClient mOkHttpClient = new OkHttpClient();
    //创建一个Request
    final Request request = new Request.Builder()
                    .url("https://github.com/hongyangAndroid")
                    .build();
    //new call
    Call call = mOkHttpClient.newCall(request); 
    //请求加入调度
    call.enqueue(new Callback()
            {
                @Override
                public void onFailure(Request request, IOException e)
                {
                }
    
                @Override
                public void onResponse(final Response response) throws IOException
                {
                        //String htmlStr =  response.body().string();
                }
            });          
    

    嗯,如果我们不封装的话,每一次使用一个get请求都会发送这么长的代码。好了,接下来我们看一下,封装后的用法。

    CommonHttpCient.sendRequest(CommonRequest.createGetRequest("http://www.baidu.com", null),
                    new CommonCallback);
    

    我们在使用request请求时,一般都会带有一定的数据,所以在些之前我自己定义了RequestParams类来处理我们的数据。

    package cn.bitbitluo.developersdk.okhttp.request;
    
    import android.os.Handler;
    
    import java.io.FileNotFoundException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    
    /**
    * @作者 bitbitluo
    * @date 2018/11/10 12:27
    * @Description: 封装所有的请求到HashMap中
    */
    public class RequestParams {
        // ConcurrentHashMap是线程安全的
        public ConcurrentHashMap<String, String> urlParams = new ConcurrentHashMap<>();
        public ConcurrentHashMap<String, Object> fileParams = new ConcurrentHashMap<>();
    
        public RequestParams(){this((Map<String, String>) null);}
    
        public RequestParams(Map<String, String> source) {
            if(source != null){
                for (Map.Entry<String, String> entry : source.entrySet()) {
                    put(entry.getKey(), entry.getValue());
                }
            }
        }
    
         // 这个是代码块初始化,能够匿名类去访问外部的变量,如果你不会使用这个,可以看我的另外一篇文章,或者自己上网搜索。
        public RequestParams(final String key, final String value) {
            this(new HashMap<String, String>(){
                {put(key, value);}
            });
        }
    
        public void put(String key, String value) {
            if (key != null && value != null) {
                urlParams.put(key, value);
            }
        }
    
        public  void put(String key, Object object) throws FileNotFoundException {
            if(key != null) {
                fileParams.put(key, object);
            }
        }
    
        public boolean hasParams(){
            if(urlParams.size() > 0 || fileParams.size() > 0){
                return true;
            }
            return false;
        }
    }
    

    接下来我们开始封装我们的get和post方法

    package cn.bitbitluo.developersdk.okhttp.request;
    
    import java.util.Map;
    
    import okhttp3.FormBody;
    import okhttp3.Request;
    
    /**
    * @作者 bitbitluo
    * @date 2018/11/10 19:02
    * @Description: 给我们生成Request对象
    */
    
    public class CommonRequest {
    
        public static Request createPostRequest(String url, RequestParams params){
            // 构建者模式 
            FormBody.Builder mFormBodyBuidy = new FormBody.Builder();
            if(params != null){
                for(Map.Entry<String, String> entry : params.urlParams.entrySet()){
                    // 将请求遍历添加到请求构件类中
                    mFormBodyBuidy.add(entry.getKey(), entry.getValue());
                }
            }
            // 通过请求构件类的build方法获得真正的请求体对象
            FormBody mFormBody = mFormBodyBuidy.build();
            return new Request.Builder().url(url).post(mFormBody).build();
        }
    
        /**
        * @作者 bitbitluo
        * @date 2018/11/10 19:16
        * @Description: 通过传入的参数返回一个Get类型的请求
        */
        public static Request createGetRequest(String url, RequestParams params) {
             //StringBuilder是非线程安全的,用在这里刚刚好
            StringBuilder urlBuilder = new StringBuilder(url).append("?");
            if(params != null) {
                for (Map.Entry<String, String> entry : params.urlParams.entrySet()) {
                    urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                }
            }
            // 我们需要把url中的最后一个&去掉
            return new Request.Builder().
                    url(urlBuilder.substring(0, urlBuilder.length() - 1)).
                    get().build();
        }
    }
    

    接下来我们get请求就很容易构建了,不过,这还不够,我们需要封装我们的clinet并且让它支持https。

    CommonRequest.createGetRequest("http://www.baidu.com", null)
    

    封装client

    package cn.bitbitluo.developersdk.okhttp.client;
    
    
    import java.util.concurrent.TimeUnit;
    
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.SSLSession;
    
    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    
    /**
    * @作者 bitbitluo
    * @date 2018/11/10 19:22
    * @Description: 请求的发送,请求参数的配置,https支持
    */
    
    public class CommonHttpCient {
        // 超时的参数
        private static final int TIME_OUT = 30;
        private static OkHttpClient mOkHttpClient;
    
         // 配制clinet参数,并创建clinet
        static {
            OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
            okHttpBuilder.connectTimeout(TIME_OUT, TimeUnit.SECONDS);
            okHttpBuilder.readTimeout(TIME_OUT, TimeUnit.SECONDS);
            okHttpBuilder.writeTimeout(TIME_OUT, TimeUnit.SECONDS);
       
            // 添加https支持
            okHttpBuilder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            okHttpBuilder.sslSocketFactory(HttpsUtils.getSslSocketFactory());
    
            mOkHttpClient = okHttpBuilder.build();
        }
    
        /**
        * @作者 bitbitluo
        * @date 2018/11/10 19:43
        * @Description: 发送具体的https请求
        */
        public static Call sendRequest(Request request, CommCallback callback) {
            Call call = mOkHttpClient.newCall(request);
            call.enqueue(callback);
            return call;
        }
    }
    

    注意,这里我们也对回调进行了封装,让他可以直接为我们解析传回来的json

    封装回调

    相关文章

      网友评论

          本文标题:封装自己的OkHttp

          本文链接:https://www.haomeiwen.com/subject/tajtfqtx.html