Okhttp封装、网络层扩展

一、概述

首先在这里本片文章是以网络通信封装为主,而app开发首先重要就是网络通信,而现在主流的async、volley、okhttp等,阿么这么网络库如何能做到更好封装、更好的切换,从而不影响业务层的代码,而本文就是基于这个思路,从而封装了okhttp,并能支持封装切换到async、或者volley,后期会支持这两个库的所有特性,并在调用时候无影响,当前版本2.6,github地址:

https://github.com/apple317/HttpClientUtils 

目前支持

  • 一般的get请求  支持
  • 一般的post请求 支持文本、表单、表单文件、单个文件操作 支持
  • 基于Http Post的文件上传(类似表单) 支持
  • 文件上传进度  支持
  • 下载文件进度 支持
  • 支持url关闭网络请求 支持
  • 支持session的保持 支持
  • 支持取消某个请求 支持
  • 支持数据异步刷新操作 
  • 支持取消tag请求、支持url取消请求  支持
  • 支持HEAD  支持
  • 支持自签名网站https的访问,提供方法设置下证书就行 不支持
  • DELETE、PATCH、PUT 支持
  • 加入网络配置、请求过程抽离 支持
  • 加入gson解析,建议加入插件gsonformat来生成解析对象,传入解析类方法setParse
  • 加入url表识来区分请求  支持

二、引用注意

  • Android Studio

    使用前,对于Android Studio的用户,可以选择添加:

    compile project(':HttpClientUtils')

三、使用说明

初始化配置

 HttpConfiguration.Builder configuration=new HttpConfiguration.Builder(getApplicationContext());
        configuration.connectTimeout(2000);
        configuration.retryOnConnectionFailure(true);
        configuration.readTimeout(2000);
        configuration.writeTimeout(2000);
        configuration.diskCacheSize(1000 * 1024);
        configuration.diskCacheDir(getCacheDir());
        BaseHttpClient.getBaseClient().init(configuration.build());
里面设置超时、读写时间、缓冲路径等

Get传入方法

 /**
     * 普通参数请求方式
     * url 传入网络地址
     * put传入值
     * tag设置tag
     */
    public void getParam(View view) {
        BaseHttpClient.getBaseClient().newBuilder()
                .url("http://api.dianping.com/v1/metadata/get_cities_with_deals")
                .put("appkey", "56065429")
                .setParse(UserBean.class)
                .put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB")
                .setTag("deals").build().execute(new HttpCallback() {
            @Override
            public void onSuccess(String content, BaseHttpClient object, Object parse) {
                //刷新ui操作
            }

            @Override
            public void onError(Throwable error, BaseHttpClient client) {

            }
        });
    }

post文本上传 

在demo中PostActivity中的postStringData方法:

 /**
     * post上传字符串
     * addUrl传入url地址
     * put传入参数可以
     * apple_txt 这个是专门用来传入文本上传的,请注意
     */
    public void postStringData(View view) {
        /**
         * 第一种写法
         */
        BaseHttpClient.getBaseClient().newBuilder().url("url")
                .content("你好好好").method(METHOD.POST_STRING)
                .build().execute(new HttpCallback() {
            @Override
            public void onSuccess(String content, BaseHttpClient object, Object parse) {
                //刷新ui
            }

            @Override
            public void onError(Throwable error, BaseHttpClient client) {

            }
        });
    }

post普通表单提交

在demo中PostActivity中的postData方法:
/**
     * 普通post请求数据
     * 默认以表单提交
     * addUrl传入url地址
     * put传入参数可以
     *setTag 设置tag
     */
    public void postData(View view) {
        /**
         * 第一种写法
         */
        BaseHttpClient.getBaseClient().newBuilder()
                .url("url")
                .put("device_id", "1236716")
                .setTag("postactivity").put("os", "2")
                .put("version", "2.1.0").
                put("mobile", "13621937708").method(METHOD.POST_FORM)
                .build().execute(new HttpCallback() {
            @Override
            public void onSuccess(String content, BaseHttpClient object, Object parse) {
                //刷新UI
            }
            @Override
            public void onError(Throwable error, BaseHttpClient client) {

            }
        });
    }



 
 

Post表单文件上传

在demo中PostActivity中的postFormFile方法:

/**
     * post
     * 表单文件上传
     * 默认以表单提交
     * addUrl传入url地址
     * put传入参数可以
     *setTag 设置tag
     * put 传入logo为文件上传定义接口名称 value:为文件对象
     * setBaseParams 通过这样的传入参数对象
     * 上传文件onProgress 会返回当前网络上传的进度
     * POST_FORM 是普通表单提交
     */
    public void postFormFile(View view) {
        try {
            File file=new File("path");
            ArrayList<File> arrayList=new ArrayList<File>();
            arrayList.add(file);
//            File file = new File(Environment.getExternalStorageDirectory()
//                    , "4cc75752fa532553bf7b6f7e00f26db8.png");
            BaseHttpClient.getBaseClient().newBuilder()
                    .url("url")
                    .put("game", "lol")
                    .put("logo", arrayList)
                    .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12")
                    .put("version", "2.1.0")
                    .put("device_id","867905026687709")
                    .put("os","2")
                    .method(METHOD.POST_FORM_FILE).build()
                    .execute(new HttpCallback() {
                        @Override
                        public void onSuccess(String content, BaseHttpClient object, Object parse) {
                               //刷新ui
                        }

                        @Override
                        public void onError(Throwable error, BaseHttpClient client) {

                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

文件上传进度

在demo中PostActivity中postFormFileProgress方法:
 /**
     * post
     * 表单文件上传
     * 默认以表单提交
     * addUrl传入url地址
     * put传入参数可以
     *setTag 设置tag
     * put 传入logo为文件上传定义接口名称 value:为文件对象 也可以为文件数组对象
     * setBaseParams 通过这样的传入参数对象
     * 类型一定要传入POST_FORM_PROGRESS
     * 上传文件onProgress 会返回当前网络上传的进度
     */
    public void postFormFileProgress(View view) {
        try {
            File file = new File(Environment.getExternalStorageDirectory()
                    , "4cc75752fa532553bf7b6f7e00f26db8.png");
            BaseHttpClient.getBaseClient().newBuilder().url("url")
                    .put("game", "lol")
                    .put("logo", file)
                    .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12")
                    .put("version", "2.1.0")
                    .put("device_id","867905026687709")
                    .put("os","2")
                    .method(METHOD.POST_FORM_PROGRESS).build()
                    .execute(new UploadCallback() {
                        @Override
                        public void onSuccess(String content, BaseHttpClient object, Object parse) {

                        }

                        @Override
                        public void onError(Throwable error, BaseHttpClient client) {

                        }

                        @Override
                        public void uploadProgress(long bytesRead, long contentLength, boolean done) {
                            mProgressBar.setProgress((int) (100 * (float)bytesRead * 1.0f / contentLength));
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
文件下载进度

在demo中DownFileActivity中的downData方法:

/**
     * addUrl 添加url地址
     * put传入参数可以
     *setTag 设置tag
     * downName 下载文件命名
     * downDir 下载文件目录 如果不传会默认生成一个getCacheDirectory
     * DownEntity 下载返回数据实体:
     * public String name;//名称
     public String path;//保存地址
     public String url;
     public int httpCode;//http网络状态
     //下载是否完成
     public boolean statue;//下载是否完成
     public long currentByte;//下载当前字节数
     public long totalByte;//下载总字节数
     public boolean isExecuted;//下载是否执行
     public String dir;//下载目录

     public boolean isCanceled;//下载是否取消
     public String message;//下载返回消息
     * @param view
     */
    public void downData(View view){
        /**
         * 第一种写法
         */
        BaseHttpClient.getBaseClient().newBuilder().url("http://112.65.235.160/vlive.qqvideo.tc.qq.com/m0019469p4a.mp4?vkey=4C7F305D62ABA38AF8BF474C40A0DF9700C8F07BF29BE26D76F17F8A7E73B9FEB1424CC479C4C863BFBDD095AA5EBE49A0CDE3EAEB32E2AD0C009E7C5B37521C0912AF6905C70C601471E664777B9C38C726B03E8D193D62&br=34&platform=2&fmt=msd&sdtfrom=v3010&type=mp4&locid=89489e75-bb18-40e4-989b-89d6b34adf32&size=56306437&ocid=1362567084")
                .downName("apple_nba").method(METHOD.DOWNLOAD_FILE).build().execute(new DownCallback() {
            @Override
            public void downProgress(DownEntity entity) {
                Log.i("HU", "======bytes===" + entity.currentByte + "==contenLength==" + entity.totalByte);
                id_progress.setProgress((int) (100 * (float) entity.currentByte * 1.0f / entity.totalByte));
                txt_content.setText("当前下载的文件目录是"+entity.path+"文件名称:"+entity.name+"网络返回code"+entity.httpCode+"===服务端返回消息=="+entity.message);
            }
        });
    }



取消单个网络请求

1.第一种方式通过url要关闭

BaseHttpClient.getBaseClient().cancelTag("url");

2.第二种方式通过传入tag来关闭

BaseHttpClient.getBaseClient()
        .setTag("deals")

mParams.setTag("tag");

取消tag网络请求

比如,在请求中传入tag对象,销魂时候可以统一销毁同一tag对象访问
@Override
protected void onDestroy()
{
    super.onDestroy();
     //可以取消同一个tag的
     BaseHttpClient.getBaseClient(getApplicationContext()).cancelTag("tag对象");
}

HEAD请求传入

 ConcurrentHashMap<String, String> headMap=new ConcurrentHashMap<String, String>();
        headMap.put("device","1231231241");
        BaseHttpClient.getBaseClient().newBuilder()
                .url("http://api.dianping.com/v1/metadata/get_cities_with_deals")
                .put("appkey", "56065429")
                .setParse(UserBean.class)
                .setHeadMap(headMap)
                .put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB")
                .setTag("deals").build().execute(new HttpCallback() {
            @Override
            public void onSuccess(String content, BaseHttpClient object, Object parse) {
                UserBean userBean=(UserBean)parse;
                txt_content.setText(userBean.getCities().get(0) + "type===" );
            }

            @Override
            public void onError(Throwable error, BaseHttpClient client) {

            }
        });
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值