本文来自周游的投稿,封装的网络请求库,github:https://github.com/zhou-you/RxEasyHttp,欢迎点击【阅读原文】,查看更多信息,如有帮助,不妨star。
本库是一款基于RxJava2+Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载进度显示,请求错误自动重试,请求携带token、时间戳、签名sign动态配置,自动登录成功后请求重发功能,3种层次的参数设置默认全局局部,默认标准ApiResult同时可以支持自定义的数据结构,已经能满足现在的大部分网络请求。 注:Retrofit和Rxjava是当下非常火爆的开源框架,均来自神一般的Square公司。本库就不介绍Retrofit和Rxjava2的用法。
为什么会封装此库?
网上好的开源网络库像Volley、async-http、okhttp、retrofit等都非常强大,但是实际应用中我们不会直接去使用,一般都会根据自己的业务再封装一层,这样更方便快捷,又能统一处理业务共性的东西例如:统一的数据结构(code、msg、data)、token处理、网络异常等情况。在使用retrofit来请求网络的时候,项目的需求越来越多,api也随之越来越多,一个普通的应用api一般也在100+左右。如果把这些api放在一个ApiService内会很臃肿,不利于查看api.如果采用模块的方式对api进行分类,每个模块对应若干个api.以retrofit的使用方式又需要创建若干个ApiService,这种方式维护方便,但是模块增多了,类也增多了很多。对于懒人来说就想通过一个URL就能回调你所需要的数据,什么ApiService都不想理会,同时又可以很快的与自己的业务相关联,就类似于代替你在开源网络库基础上再封装一层的作用,于是本库就应运而生。
特点
比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,线程智能控制
演示(请star支持)
版本说明
当前版本
V2.0.0
网络库从Rxjava升级到Rxjava2
优化缓存策略实现
修复同步请求回调问题
修复put请求失败问题
修改图片请求失败@url问题导致404错误
修复多图片表单上传失败问题
Demo增加根据key获取缓存的演示
修复post提交json到后台问题
定位upObject失败原因,需要加转换器addConverterFactory(GsonConverterFactory.create())
更新日志
点击查看更新日志
用法介绍
目前只支持主流开发工具AndtoidStudio的使用,没有提供Eclipse使用方式. 本项目Demo的网络请求的服务器地址为了安全,把url去掉了,但是Demo程序中的示例都是ok的
点击下载Demo体验 RxEasyHttp-Demo
build.gradle设置
dependencies { compile 'com.zhouyou:rxeasyhttp:2.0.0'}
想查看所有版本,请点击下面地址。
Latest release: https://jcenter.bintray.com/com/zhouyou/rxeasyhttp/
权限说明
如果使用本库实现文件下载到SD卡、或者配置了缓存数据到SD卡,你必须要考虑到Android6.0及以上系统的运行时权限,给大家推荐两个权限库:
AndPermission
RxPermissions
因为要请求网络、从SD卡读写缓存、下载文件到SD卡等等,所以需要在manifest.xml中配置以下几个权限,如果你已经配置过了这些权限,请不要重复配置:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/>
全局配置
一般在 Aplication,或者基类中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息 初始化需要一个Context,最好在Application#onCreate()中初始化,记得在manifest.xml中注册Application。
Application:
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); }}
manifest.xml:
...<application 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 // 打开该调试开关并设置TAG,不需要就不要加入该行 // 最后的true表示是否打印okgo的内部异常,一般打开方便调试错误 .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());//添加参数签名拦截器 }}