retrofit 会请求两次_基于RxJava2+Retrofit2简单易用的网络请求实现

简介

基于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,线程智能控制

演示

1.gif

2.gif

3.gif

4.gif

全局配置

一般在 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)//设置全局公共参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值