美文网首页
封装自己的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