简介
基于RxJava2+Retrofit2实现简单易用的网络请求,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载进度显示,请求错误自动重试,请求携带token、时间戳、签名sign动态配置,自动登录成功后请求重发功能,3种层次的参数设置默认全局局部,默认标准ApiResult同时可以支持自定义的数据结构,已经能满足现在的大部分网络请求。
特点
比Retrofit使用更简单、更易用。
采用链式调用一点到底
加入基础ApiService,减少Api冗余
支持动态配置和自定义底层框架Okhttpclient、Retrofit.
支持多种方式访问网络GET、POST、PUT、DELETE等请求协议
支持网络缓存,八种缓存策略可选,涵盖大多数业务场景
支持固定添加header和动态添加header
支持添加全局参数和动态添加局部参数
支持文件下载、多文件上传和表单提交数据
支持文件请求、上传、下载的进度回调、错误回调,也可以自定义回调
支持默认、全局、局部三个层次的配置功能
支持任意数据结构的自动解析
支持添加动态参数例如timeStamp时间戳、token、签名sign
支持自定义的扩展API
支持多个请求合并
支持Cookie管理
支持异步、同步请求
支持Https、自签名网站Https的访问、双向验证
支持失败重试机制,可以指定重试次数、重试间隔时间
支持根据ky删除网络缓存和清空网络缓存
提供默认的标准ApiResult解析和回调,并且可自定义ApiResult
支持取消数据请求,取消订阅,带有对话框的请求不需要手动取消请求,对话框消失会自动取消请求
支持请求数据结果采用回调和订阅两种方式
api设计上结合http协议和android平台特点来实现,loading对话框,实时进度条显示
返回结果和异常统一处理
结合RxJava2,线程智能控制
演示
全局配置
一般在 Aplication,或者基类中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息
初始化需要一个Context,最好在Application#onCreate()中初始化,记得在manifest.xml中注册Application。
Application:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
}
}
manifest.xml:
...
android:name=".MyApplication"
...
/>
默认初始化
如果使用默认始化后,一切采用默认设置。如果你需要配置全局超时时间、缓存、Cookie、底层为OkHttp的话,请看高级初始化。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
EasyHttp.init(this);//默认初始化
}
}
高级初始化
可以进行超时配置、网络缓存配置、okhttp相关参数配置、retrofit相关参数配置、cookie配置等,这些参数可以选择性的根据业务需要配置。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
EasyHttp.init(this);//默认初始化,必须调用
//全局设置请求头
HttpHeaders headers = new HttpHeaders();
headers.put("User-Agent", SystemInfoUtils.getUserAgent(this, AppConstant.APPID));
//全局设置请求参数
HttpParams params = new HttpParams();
params.put("appId", AppConstant.APPID);
//以下设置的所有参数是全局参数,同样的参数可以在请求的时候再设置一遍,那么对于该请求来讲,请求中的参数会覆盖全局参数
EasyHttp.getInstance()
//可以全局统一设置全局URL
.setBaseUrl(Url)//设置全局URL url只能是域名 或者域名+端口号
// 打开该调试开关并设置TAG,不需要就不要加入该行
// 最后的true表示是否打印内部异常,一般打开方便调试错误
.debug("EasyHttp", true)
//如果使用默认的60秒,以下三行也不需要设置
.setReadTimeOut(60 * 1000)
.setWriteTimeOut(60 * 100)
.setConnectTimeout(60 * 100)
//可以全局统一设置超时重连次数,默认为3次,那么最差的情况会请求4次(一次原始请求,三次重连请求),
//不需要可以设置为0
.setRetryCount(3)//网络不好自动重试3次
//可以全局统一设置超时重试间隔时间,默认为500ms,不需要可以设置为0
.setRetryDelay(500)//每次延时500ms重试
//可以全局统一设置超时重试间隔叠加时间,默认为0ms不叠加
.setRetryIncreaseDelay(500)//每次延时叠加500ms
//可以全局统一设置缓存模式,默认是不使用缓存,可以不传,具体请看CacheMode
.setCacheMode(CacheMode.NO_CACHE)
//可以全局统一设置缓存时间,默认永不过期
.setCacheTime(-1)//-1表示永久缓存,单位:秒 ,Okhttp和自定义RxCache缓存都起作用
//全局设置自定义缓存保存转换器,主要针对自定义RxCache缓存
.setCacheDiskConverter(new SerializableDiskConverter())//默认缓存使用序列化转化
//全局设置自定义缓存大小,默认50M
.setCacheMaxSize(100 * 1024 * 1024)//设置缓存大小为100M
//设置缓存版本,如果缓存有变化,修改版本后,缓存就不会被加载。特别是用于版本重大升级时缓存不能使用的情况
.setCacheVersion(1)//缓存版本为1
//.setHttpCache(new Cache())//设置Okhttp缓存,在缓存模式为DEFAULT才起作用
//可以设置https的证书,以下几种方案根据需要自己设置
.setCertificates() //方法一:信任所有证书,不安全有风险
//.setCertificates(new SafeTrustManager()) //方法二:自定义信任规则,校验服务端证书
//配置https的域名匹配规则,不需要就不要加入,使用不当会导致https握手失败
//.setHostnameVerifier(new SafeHostnameVerifier())
//.addConverterFactory(GsonConverterFactory.create(gson))//本框架没有采用Retrofit的Gson转化,所以不用配置
.addCommonHeaders(headers)//设置全局公共头
.addCommonParams(params)//设置全局公共参数
//.addNetworkInterceptor(new NoCacheInterceptor())//设置网络拦截器
//.setCallFactory()//局设置Retrofit对象Factory
//.setCookieStore()//设置cookie
//.setOkproxy()//设置全局代理
//.setOkconnectionPool()//设置请求连接池
//.setCallbackExecutor()//全局设置Retrofit callbackExecutor
//可以添加全局拦截器,不需要就不要加入,错误写法直接导致任何回调不执行
//.addInterceptor(new GzipRequestInterceptor())//开启post数据进行gzip后发送给服务器
.addInterceptor(new CustomSignInterceptor());//添加参数签名拦截器
}
}
请求数据
网络请求,采用链式调用,支持一点到底。
入口方法
/**
* get请求
*/
public static GetRequest get(String url);
/**
* post请求和文件上传
*/
public static PostRequest post(String url);
/**
* delete请求
*/
public static DeleteRequest delete(String url) ;
/**
* 自定义请求
*/
public static CustomRequest custom();
/**
* 文件下载
*/
public static DownloadRequest downLoad(String url) ;
/**
* put请求
*/
public static PutRequest put(String url);
通用功能配置
1.包含一次普通请求所有能配置的参数,真实使用时不需要配置这么多,按自己的需要选择性的使用即可
2.以下配置全部是单次请求配置,不会影响全局配置,没有配置的仍然是使用全局参数。
3.为单个请求设置超时,比如涉及到文件的需要设置读写等待时间多一点。
完整参数GET示例:
EasyHttp.get("/v1/app/chairdressing/skinAnalyzePower/skinTestResult")
.baseUrl("http://www.xxxx.com")//设置url
.writeTimeOut(30*1000)//局部写超时30s,单位毫秒
.readTimeOut(30*1000)//局部读超时30s,单位毫秒
.connectTimeout(30*1000)//局部连接超时30s,单位毫秒
.headers(new HttpHeaders("header1","header1Value"))//添加请求头参数
.headers("header2","header2Value")//支持添加多个请求头同时添加
.headers("header3","header3Value")//支持添加多个请求头同时添加
.params("param1","param1Value")//支持添加多个参数同时添加
.params("param2","param2Value")//支持添加多个参数同时添加
//.addCookie(new CookieManger(this).addCookies())//支持添加Cookie
.cacheTime(300)//缓存300s 单位s
.cacheKey("cachekey")//缓存key
.cacheMode(CacheMode.CACHEANDREMOTE)//设置请求缓存模式
//.okCache()//使用模式缓存模式时,走Okhttp缓存
.cacheDiskConverter(new GsonDiskConverter())//GSON-数据转换器
//.certificates()添加证书
.retryCount(5)//本次请求重试次数
.retryDelay(500)//本次请求重试延迟时间500ms
.addInterceptor(Interceptor)//添加拦截器
.okproxy()//设置代理
.removeHeader("header2")//移除头部header2
.removeAllHeaders()//移除全部请求头
.removeParam("param1")
.accessToken(true)//本次请求是否追加token
.timeStamp(false)//本次请求是否携带时间戳
.sign(false)//本次请求是否需要签名
.syncRequest(true)//是否是同步请求,默认异步请求。true:同步请求
.execute(new CallBack() {
@Override
public void onStart() {
//开始请求
}
@Override
public void onCompleted() {
//请求完成
}
@Override
public void onError(ApiException e) {
//请求错误
}
@Override
public void onSuccess(SkinTestResult response) {
//请求成功
}
});
url
Url可以通过初始化配置的时候传入EasyHttp.getInstance().setBaseUrl("http://www.xxx.com");
入口方法传入: EasyHttp.get("/v1/app/chairdressing/skinAnalyzePower/skinTestResult").baseUrl("http://www.xxxx.com")
如果入口方法中传入的url含有http或者https,则不会拼接初始化设置的baseUrl.
例如:EasyHttp.get("http://www.xxx.com/v1/app/chairdressing/skinAnalyzePower/skinTestResult")则setBaseUrl()和baseUrl()传入的baseurl都不会被拼接。
注:EasyHttp.get/post/put/等采用拼接的用法时请注意,url要用/斜杠开头,例如:EasyHttp.get("/v1/login") 正确 EasyHttp.get("v1/login") 错误
http请求参数
两种设置方式
.params(HttpParams params)
.params("param1","param1Value")//添加参数键值对
HttpParams params = new HttpParams();
params.put("appId", AppConstant.APPID);
.addCommonParams(params)//设置全局公共参数