• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

MrZhousf/OkHttp3: 基于OkHttp3封装的网络请求库——致力于最简洁、功能最全、可灵活 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

MrZhousf/OkHttp3

开源软件地址:

https://github.com/MrZhousf/OkHttp3

开源编程语言:

Java 100.0%

开源软件介绍:

OkHttp3

基于OkHttp3封装的网络请求库

功能点

  • 支持Http/Https协议/自定义Https证书认证
  • 支持同步/异步请求
  • 支持异步延迟执行
  • 支持Post/Get/Put/Delete请求
  • 支持Cookie持久化,支持Gzip压缩
  • 支持协议头参数Head设置
  • 支持二进制参数、JSON、表单提交、SOAP提交
  • 支持Gson解析、Unicode自动转码、请求参数编码以及服务器响应编码设置
  • 支持四种缓存类型请求:仅网络、仅缓存、先网络再缓存、先缓存再网络
  • 支持自定义缓存存活时间与缓存清理功能
  • 当Activity/Fragment销毁时自动取消相应的所有网络请求,支持取消指定请求
  • 异步请求响应自动切换到UI线程,摒弃runOnUiThread
  • Application中自定义全局配置/增加系统默认配置
  • 支持文件和图片上传/批量上传,支持同步/异步上传,支持进度提示
  • 支持文件下载/批量下载,支持同步/异步下载,支持进度提示
  • 支持文件断点下载,独立下载的模块摒弃了数据库记录断点的过时方法
  • 完整的日志跟踪与异常处理
  • 支持请求结果拦截以及异常处理拦截
  • 支持单例客户端,提高网络请求速率
  • 完整的API示例
  • 后续优化中...

相关截图

网络请求演示

先网络再缓存演示

先缓存再网络演示

上传图片界面

断点下载文件界面

日志

  • GET-URL/POST-URL:请求地址
  • CostTime:请求耗时(单位:秒)
  • Response:响应串

项目演示DEMO

项目中已包含所有支持业务的demo,详情请下载项目参考源码。

引用方式

Maven

<dependency>
  <groupId>com.zhousf.lib</groupId>
  <artifactId>okhttp3</artifactId>
  <version>2.9.9</version>
  <type>pom</type>
</dependency>

Gradle

compile 'com.zhousf.lib:okhttp3:2.9.9'

若项目已包含support-annotations或出现support-annotations版本冲突请采用下面方式进行依赖:

compile ('com.zhousf.lib:okhttp3:2.9.9'){
    exclude(module: 'support-annotations')
}

若项目已包含Gson或出现Gson版本冲突请采用下面方式进行依赖:

compile ('com.zhousf.lib:okhttp3:2.9.9'){
    exclude(module:'gson')
}

ProGuard

如果你使用了ProGuard混淆,请添加如下配置:

-dontwarn okio.**

SDK版本

compileSdkVersion 23
targetSdkVersion 23
minSdkVersion 13

提交记录

  • 2016-6-29 项目提交
  • 2016-7-4
    • 项目框架调整
    • 增加Application中全局配置
    • 增加系统默认配置
    • 修复内存释放bug
  • 2016-7-19
    • 代码优化、降低耦合
    • 修复已知bug
  • 2016-8-9
    • 增加文件上传功能,支持批量上传
  • 2016-8-10
    • 增加文件下载功能,支持批量下载、断点下载
  • 2016-10-10
    • 增加请求结果拦截以及异常处理拦截
  • 2016-10-25
    • 支持Cookie持久化、协议头参数Head设置
  • 2016-12-12
    • 增加单例客户端,提高网络请求速率、取消指定请求功能
  • 2017-3-3
    • 修复上传文件入参bug(感谢Sanqi5401指正)
  • 2017-3-6
  • 2017-3-31
    • 增加单次批量上传文件功能:一次请求上传多个文件
  • 2017-4-21
    • 增加二进制流请求功能,DEMO中已添加动态权限申请功能
  • 2017-6-1
    • 支持PUT、DELETE请求
  • 2017-6-30
    • 支持异步延迟执行
  • 2017-9-13
    • Gson自动解析
  • 2017-9-20
    • 增加加载提示框示例
  • 2017-10-17
    • 支持自定义Https证书认证,增加实时网速浮动窗口
  • 2017-11-1
    • 增加Http动态代理示例,项目集成第三方网络库示例
  • 2018-1-4
    • 支持SOAP请求
  • 2018-1-16
    • 支持接口响应结果自定义解析Response;修复单例bug,感谢@yangjieK指正

权限

    <!-- 添加读写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!-- 访问互联网权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

自定义全局配置

在Application中配置如下:

        String downloadFileDir = Environment.getExternalStorageDirectory().getPath()+"/okHttp_download/";
        String cacheDir = Environment.getExternalStorageDirectory().getPath()+"/okHttp_cache";
        OkHttpUtil.init(context)
                .setConnectTimeout(15)//连接超时时间
                .setWriteTimeout(15)//写超时时间
                .setReadTimeout(15)//读超时时间
                .setMaxCacheSize(10 * 1024 * 1024)//缓存空间大小
                .setCacheType(CacheType.FORCE_NETWORK)//缓存类型
                .setHttpLogTAG("HttpLog")//设置请求日志标识
                .setIsGzip(false)//Gzip压缩,需要服务端支持
                .setShowHttpLog(true)//显示请求日志
                .setShowLifecycleLog(false)//显示Activity销毁日志
                .setRetryOnConnectionFailure(false)//失败后不自动重连
                .setCachedDir(new File(cacheDir))//设置缓存目录
                .setDownloadFileDir(downloadFileDir)//文件下载保存目录
                .setResponseEncoding(Encoding.UTF_8)//设置全局的服务器响应编码
                .setRequestEncoding(Encoding.UTF_8)//设置全局的请求参数编码
                .setHttpsCertificate("12306.cer")//设置全局Https证书
                .addResultInterceptor(HttpInterceptor.ResultInterceptor)//请求结果拦截器
                .addExceptionInterceptor(HttpInterceptor.ExceptionInterceptor)//请求链路异常拦截器
                .setCookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)))//持久化cookie
                .build();
            

获取网络请求客户端单例示例

//获取单例客户端(默认)
 方法OkHttpUtil.getDefault(this)//绑定生命周期
            .doGetSync(HttpInfo.Builder().setUrl(url).build());
 方法二、OkHttpUtil.getDefault()//不绑定生命周期
            .doGetSync(HttpInfo.Builder().setUrl(url).build());
            

取消指定请求

建议在视图中采用OkHttpUtil.getDefault(this)的方式进行请求绑定,该方式会在Activity/Fragment销毁时自动取消当前视图下的所有请求; 请求标识类型支持Object、String、Integer、Float、Double; 请求标识务必保证唯一

//*******请求时先绑定请求标识,根据该标识进行取消*******/
//方法一:
OkHttpUtil.Builder()
                .setReadTimeout(120)
                .build("请求标识")//绑定请求标识
                .doDownloadFileAsync(info);
//方法二:
OkHttpUtil.getDefault("请求标识")//绑定请求标识
            .doGetSync(info);
            
//*******取消指定请求*******/ 
OkHttpUtil.getDefault().cancelRequest("请求标识");
 

HttpInfo参数解析:

  • 键值对提交采用addParam/addParams方法
  • Json提交采用addParamJson方法
  • 表单提交采用addParamForm方法
  • 二进制字节流提交采用addParamBytes方法
  • 文件上传采用addDownloadFile方法
  • 文件下载采用addUploadFile方法
HttpInfo.Builder()
        .setUrl(url)
        .setRequestType(RequestType.GET)//请求方式
        .addHead("head","test")//添加头参数
        .setContentType(ContentType.SOAP)//设置媒体类型
        .addParam("param","test")//添加接口键值对参数
        .addParams(new HashMap<String, String>())//添加接口键值对参数集合
        .addParamBytes("byte")//添加二进制流
        .addParamJson("json")//添加Json参数
        .addParamFile(new File(""))//添加文档参数
        .addParamForm("form")//添加表单参数
        .addDownloadFile(new DownloadFileInfo("fileURL", "myMP4",null))//添加下载文件
        .addUploadFile("interfaceParamName","filePathWithName",null)//添加上传文件
        .setResponseEncoding(Encoding.UTF_8)//设置服务器响应编码
        .setRequestEncoding(Encoding.UTF_8)//设置全局的请求参数编码
        .setDelayExec(2, TimeUnit.SECONDS)//延迟2秒执行
        .setHttpsCertificate("12306.cer")//设置Https证书
        .setNeedResponse(true)//设置返回结果为Response
        .build()

在Activity中同步调用示例

    /**
     * 同步请求:由于不能在UI线程中进行网络请求操作,所以采用子线程方式
     */
    private void sync() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                final HttpInfo info = HttpInfo.Builder()
                        .setUrl(url)
                        .setResponseEncoding(Encoding.UTF_8)//设置该接口的服务器响应编码
                        .setRequestEncoding(Encoding.UTF_8)//设置该接口的请求参数编码
                        .build();
                OkHttpUtil.getDefault(this)
                        .doGetSync(info);
                final String result = info.getRetDetail();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        resultTV.setText("同步请求:" + result);
                        setFromCacheTV(info);

                    }
                });
            }
        }).start();
    }

在Activity中异步调用示例

    /**
     * 异步请求:回调方法可以直接操作UI
     */
    private void async() {
        OkHttpUtil.getDefault(this).doGetAsync(
                HttpInfo.Builder().setUrl(url).build(),
                new Callback() {
                    @Override
                    public void onFailure(HttpInfo info) throws IOException {
                        String result = info.getRetDetail();
                        resultTV.setText("异步请求失败:" + result);
                    }

                    @Override
                    public void onSuccess(HttpInfo info) throws IOException {
                        String result = info.getRetDetail();
                        resultTV.setText("异步请求成功:" + result);
                        //GSon解析
                        TimeAndDate time = info.getRetDetail(TimeAndDate.class);
                        LogUtil.d("MainActivity", time.getResult().toString());
                        setFromCacheTV(info);
                    }
                });
    }

仅网络请求

    /**
     * 仅网络请求
     */
    private void forceNetwork(){
        OkHttpUtil.Builder().setCacheType(CacheType.FORCE_NETWORK).build(this)
                .doGetAsync(
                        HttpInfo.Builder().setUrl(url).build(),
                        new Callback() {
                            @Override
                            public void onSuccess(HttpInfo info) throws IOException {
                                String result = info.getRetDetail();
                                resultTV.setText("FORCE_NETWORK:" + result);
                                setFromCacheTV(info);
                            }

                            @Override
                            public void onFailure(HttpInfo info) throws IOException {
                                resultTV.setText("FORCE_NETWORK:" + info.getRetDetail());
                            }
                        }
                );
    }

仅缓存请求

    /**
     * 仅缓存请求
     */
    private void forceCache(){
        OkHttpUtil.Builder().setCacheType(CacheType.FORCE_CACHE).build(this)
                .doGetAsync(
                        HttpInfo.Builder().setUrl(url).build(),
                        new Callback() {
                            @Override
                            public void onSuccess(HttpInfo info) throws IOException {
                                String result = info.getRetDetail();
                                resultTV.setText("FORCE_CACHE:" + result);
                                setFromCacheTV(info);
                            }

                            @Override
                            public void onFailure(HttpInfo info) throws IOException {
                                resultTV.setText("FORCE_CACHE:" + info.getRetDetail());
                            }
                        }
                );
    }

先网络再缓存

    /**
     * 先网络再缓存:先请求网络,失败则请求缓存
     */
    private void networkThenCache() {
        OkHttpUtil.Builder().setCacheType(CacheType.NETWORK_THEN_CACHE).build(this)
                .doGetAsync(
                        HttpInfo.Builder().setUrl(url).build(),
                        new Callback() {
                            @Override
                            public void onSuccess(HttpInfo info) throws IOException {
                                String result = info.getRetDetail();
                                resultTV.setText("NETWORK_THEN_CACHE:" + result);
                                setFromCacheTV(info);
                            }

                            @Override
                            public void onFailure(HttpInfo info) throws IOException {
                                resultTV.setText("NETWORK_THEN_CACHE:" + info.getRetDetail());
                            }
                        }
                );
    }

先缓存再网络

    /**
     * 先缓存再网络:先请求缓存,失败则请求网络
     */
    private void cacheThenNetwork() {
        OkHttpUtil.Builder().setCacheType(CacheType.CACHE_THEN_NETWORK).build(this)
                .doGetAsync(
                        HttpInfo.Builder().setUrl(url).build(),
                        new Callback() {
                            @Override
                            public void onSuccess(HttpInfo info) throws IOException {
                                String result = info.getRetDetail();
                                resultTV.setText("CACHE_THEN_NETWORK:" + result);
                                setFromCacheTV(info);
                            }

                            @Override
                            public void onFailure(HttpInfo info) throws IOException {
                                resultTV.setText("CACHE_THEN_NETWORK:" + info.getRetDetail());
                            }
                        }
                );
    }

缓存10秒失效


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
CNSRE/HttpDNSServer发布时间:2022-06-17
下一篇:
JuliaWeb/HttpServer.jl: DEPRECATED! Basic, non-blocking HTTP server in Julia.发布时间:2022-06-17
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap