OKHTTP的封装和一个自定义的日志拦截器

先写一个接口

    void success(T t);
    void filed(Exception e);
}

这里的接口代表了网络请求的成功和失败
之后是网络请求的类

    //单例的静态变量
    private static volatile OkHttpqq mokqq;
    private final Handler mHandler;
    private OkHttpClient mOkhttp;
    //私有构造方法,为了让你的类不能直接new
    private OkHttpqq() {
        //创建一个handler对象
        mHandler = new Handler(Looper.getMainLooper());
        //B.okhttp添加公共参数到拦截器中
        Map<String, String> map = new HashMap<>();
        map.put("", "");
        PublicParameter publicParameter = new PublicParameter(map);
        //创建一个OKHTTP对象
        mOkhttp = new OkHttpClient.Builder()
                .addInterceptor(publicParameter )
                .connectTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .writeTimeout(5, TimeUnit.SECONDS)
                .build();
    }
    //单例
    public static OkHttpqq getMokqq(){
        if (mokqq==null){
            synchronized (OkHttpqq.class){
                if (mokqq==null){
                    mokqq=new OkHttpqq();
                }
            }
        }
        return mokqq;
    }
    //get请求方法,这里实现了一个接口
    public void doGet(String s, final Call<String> Call){
        //get请求方法
        Request build1 = new Request.Builder().get().url(s).build();
        //成功和失败的方法
        mOkhttp.newCall(build1).enqueue(new Callback() {
            @Override
            public void onFailure(final okhttp3.Call call, final IOException e) {
                if (Call!=null){
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Call.filed(e);
                        }
                    });
                }
            }

            @Override
            public void onResponse(okhttp3.Call call, Response response) throws IOException {
                final String req = response.body().string();
                if (Call!=null){
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Call.success(req);
                        }
                    });
                }
            }
        });
    }
    //post请求方法,这里实现了一个接口
    public void doPost(String ss, Map<String ,String> map, final Call<String> call01){
        //这个是请求参数需要的一个对象
        FormBody.Builder builder = new FormBody.Builder();
        if (map!=null){
            for (String user: map.keySet()) {
                builder.add(user,map.get(user));
            }
        }
        FormBody formBody = builder.build();
        //post请求方法
        Request build = new Request.Builder().post(formBody).url(ss).build();
        //成功和失败的方法
        mOkhttp.newCall(build).enqueue(new Callback() {
            @Override
            public void onFailure(final okhttp3.Call call, final IOException e) {
                if (call!=null){
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            call01.filed(e);
                        }
                    });
                }

            }

            @Override
            public void onResponse(okhttp3.Call call, final Response response) throws IOException {
                if (call!=null){
                    final String string = response.body().string();
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            call01.success(string);
                        }
                    });
                }
            }
        });

    }
}

这里封装了get和post的方法。
还有一个日志的拦截器:

 *  日志拦截器类,请求来了,先在这里进行处理,可以得到发请求到得到请求消耗多久的时间
 *  作用:可以排查网络请求速度慢的根本原因
 *  1.有可能是我们在请求网络时,客户端写了一堆业务逻辑
 *  2.有可能是服务器端,写的有问题
 *  3.有可能就是网速不给力
 *
 */
public class PublicParameter implements Interceptor {
    Map<String,String> mParentMap;

    public PublicParameter(Map<String, String> parentMap) {
        mParentMap = parentMap;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        //拿到request
        Request requestFu = chain.request();
        //用request获取网址
        String url = requestFu.url().toString();
        //判断是什么请求方法
        if (requestFu.method().equalsIgnoreCase("Get")){
            //判断集合是否非空
            if (mParentMap!=null && mParentMap.size()>0){
                //获取build对象
                StringBuilder urlBuilder = new StringBuilder(url);
                for(Map.Entry<String,String> user: mParentMap.entrySet()){
                    //进行拼接
                    urlBuilder.append("&"+user.getKey()+"="+user.getValue());
                }
                //获取字符串
                url = urlBuilder.toString();
                //判断是否有?这个字符
                if (!url.contains("?")){
                    //如果没有?就替换一个
                    url= url.replaceFirst("&","?");
                }
                Request build = requestFu.newBuilder().url(url).build();
                return chain.proceed(build);
            }
        }else {
            //判断集合是否非空
            if (mParentMap!=null && mParentMap.size()>0){
                RequestBody requestBody = requestFu.body();
                if (requestBody!=null && requestBody instanceof FormBody){
                    FormBody body = (FormBody) requestBody;
                    //把原来的的body里面的参数添加到新的body中
                    FormBody.Builder form = new FormBody.Builder();
                    //为了防止重复添加相同的key和value
                    HashMap<String,String> hashMap=new HashMap<>();
                    for (int i = 0; i <body.size() ; i++) {
                        form.add(body.encodedName(i),body.encodedValue(i));
                        hashMap.put(body.encodedName(i),body.encodedValue(i));
                    }
                    //添加公共参数
                    for(HashMap.Entry<String,String> user: mParentMap.entrySet() ){
                        if (!hashMap.containsKey(user.getKey())){
                            form.add(user.getKey(),user.getValue());
                        }
                    }
                    FormBody build = form.build();
                    Request request = requestFu.newBuilder().post(build).build();
                    return chain.proceed(request);
                }
            }
        }
        return chain.proceed(requestFu);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值