# OkHttpUtils
### 封装了okhttp的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持cookie自动管理,支持四种缓存模式缓存网络数据,支持301、302重定向,扩展了统一的上传管理和下载管理功能
该项目参考了以下项目:
* [https://github.com/hongyangAndroid/okhttp-utils](https://github.com/hongyangAndroid/okhttp-utils)
* [https://github.com/yanzhenjie/NoHttp](https://github.com/Y0LANDA/NoHttp)
* [https://github.com/wyouflf/xUtils](https://github.com/wyouflf/xUtils)
在此特别感谢上述作者,喜欢原作的可以去使用原项目。同时欢迎大家下载体验本项目,如果使用过程中遇到什么问题,欢迎反馈。
## 联系方式
* 邮箱地址:
[email protected]
* QQ群: 489873144 (建议使用QQ群,邮箱使用较少,可能看的不及时)
* 本群旨在为使用我的github项目的人提供方便,如果遇到问题欢迎在群里提问。个人能力也有限,希望一起学习一起进步。
## 演示

## 1.用法
> * 为了方便大家使用,更加通俗的理解http的网络协议,建议做网络请求的时候,对每个请求抓包后查看请求信息和响应信息。
> * 如果是 Windows 操作系统,可以使用 `Fiddler` 对手机的请求进行抓包查看。
> * 如果是 Mac OS 操作系统,可以使用 `Charles` 对手机的请求进行抓包查看。
> * 具体的下载地址和抓包配置方法,我这就不提供了,请自行百度或谷歌。
对于Eclipse不能运行项目的,提供了apk供直接运行,位于项目根目录 `okhttputils_v1.x.x.apk`。
本项目Demo的网络请求是我自己的服务器,有时候可能不稳定,网速比较慢时请耐心等待。。
* 对于Android Studio的用户,可以选择添加:
```java
compile 'com.lzy.net:okhttputils:1.6.6' //可以单独使用,不需要依赖下方的扩展包
compile 'com.lzy.net:okhttpserver:0.1.7' //扩展了下载管理和上传管理,根据需要添加
compile 'com.lzy.net:okhttputils:+' //版本号使用 + 可以自动引用最新版
compile 'com.lzy.net:okhttpserver:+' //版本号使用 + 可以自动引用最新版
```
* 或者使用
```java
compile project(':okhttputils')
compile project(':okhttpserver')
```
* 对于Eclipse的用户,可以选择添加 `/lib` 目录下的:
```java
okhttputils-1.6.6.jar
okhttpserver-0.1.7.jar
```
#### 其中的图片选择是我的另一个开源项目,完全仿微信的图片选择库,自带 矩形图片裁剪 和 圆形图片裁剪 功能,有需要的可以去下载使用,附上地址:[https://github.com/jeasonlzy0216/ImagePicker](https://github.com/jeasonlzy0216/ImagePicker)
## 2.使用注意事项
* `okhttputils`使用的`okhttp`的版本是最新的 3.2.0 版本,和以前的 2.x 的版本可能会存在冲突。
* `okhttpserver`是对`okhttputils`的扩展,统一了下载管理和上传管理,对项目有需要做统一下载的可以考虑使用该扩展,不需要的可以直接使用`okhttputils`即可。
* 对于缓存模式使用,需要与返回对象相关的所有`javaBean`必须实现`Serializable`接口,否者会报`NotSerializableException`。
* 使用缓存时,如果不指定`cacheKey`,默认是用url带参数的全路径名为`cacheKey`。
* 使用该网络框架时,必须要在 Application 中做初始化 `OkHttpUtils.init(this);`。
## 3.目前支持
* 一般的 get,post,put,delete,head,options请求
* 基于Post的大文本数据上传
* 多文件和多参数统一的表单上传
* 支持一个key上传一个文件,也可以一个Key上传多个文件
* 大文件下载和下载进度回调
* 大文件上传和上传进度回调
* 支持cookie的内存存储和持久化存储,支持传递自定义cookie
* 支持304缓存协议,扩展四种本地缓存模式,并且支持缓存时间控制
* 支持301、302重定向
* 支持链式调用
* 支持可信证书和自签名证书的https的访问
* 支持根据Tag取消请求
* 支持自定义泛型Callback,自动根据泛型返回对象
## 4.扩展功能
* 统一的文件下载管理:默认使用的是 get 请求,同时下载数量为3个,支持断点下载,断点信息使用`ORMLite`数据库框架保存,默认下载路径`/storage/emulated/0/download`,下载路径和下载数量都可以在代码中配置,下载管理使用了服务提高线程优先级,避免后台下载时被系统回收
* 统一的文件上传管理:默认使用的是 post 上传请求,该上传管理为简单管理,不支持断点续传和分片上传,只是简单的将所有上传任务使用线程池进行了统一管理,默认同时上传数量为1个
## 一、全局配置
一般在 Aplication,或者基类中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息
```java
@Override
public void onCreate() {
super.onCreate();
HttpHeaders headers = new HttpHeaders();
headers.put("commonHeaderKey1", "commonHeaderValue1"); //所有的 header 都 不支持 中文
headers.put("commonHeaderKey2", "commonHeaderValue2");
HttpParams params = new HttpParams();
params.put("commonParamsKey1", "commonParamsValue1"); //所有的 params 都 支持 中文
params.put("commonParamsKey2", "这里支持中文参数");
//必须调用初始化
OkHttpUtils.init(this);
//以下都不是必须的,根据需要自行选择
OkHttpUtils.getInstance()//
.debug("OkHttpUtils") //是否打开调试
.setConnectTimeout(OkHttpUtils.DEFAULT_MILLISECONDS) //全局的连接超时时间
.setReadTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS) //全局的读取超时时间
.setWriteTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS) //全局的写入超时时间
//.setCookieStore(new MemoryCookieStore()) //cookie使用内存缓存(app退出后,cookie消失)
//.setCookieStore(new PersistentCookieStore()) //cookie持久化存储,如果cookie不过期,则一直有效
.addCommonHeaders(headers) //设置全局公共头
.addCommonParams(params); //设置全局公共参数
}
```
## 二、普通请求
### 1.基本的网络请求
```java
OkHttpUtils.get(Urls.URL_METHOD) // 请求方式和请求url
.tag(this) // 请求的 tag, 主要用于取消对应的请求
.cacheKey("cacheKey") // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
.cacheMode(CacheMode.DEFAULT) // 缓存模式,详细请看缓存介绍
.execute(new JsonCallback<RequestInfo>(RequestInfo.class) {
@Override
public void onResponse(boolean isFromCache, RequestInfo requestInfo, Request request, @Nullable Response response) {
// requestInfo 对象即为所需要的结果对象
}
});
```
### 2.请求 Bitmap 对象
```java
OkHttpUtils.get(Urls.URL_IMAGE)//
.tag(this)//
.execute(new BitmapCallback() {
@Override
publi