本框架集成Retrofit+RxJava整合框架,可以简单便捷地进行网络请求。
略
dependencies {
implementation 'com.shuai:retrofit-rx-net:x.x.x'
}
版本号 一般采用Tag中最新的版本。
请在Application中初始化如下代码:
NetConfig.init(this)
.baseConfig(new NetBaseConfigProvider() {
/**
* 配置库的debug状态
* 影响debug调试域名,请求日志输出,以及可能影响普通的log日志输出
*/
@Override
public boolean isDebug() {
return BuildConfig.DEBUG;
}
/**
* 配置库的log输出状态
* 如果没有配置,随 {@link #isDebug()}状态走
*/
@Override
public boolean isLogDebug() {
return super.isLogDebug();
}
})
.requestConfig(new NetRequestConfigProvider() {
/**
* 配置默认Auth:公共请求header。(可选)
*/
@NotNull
@Override
public Map<String, String> getHeaderMap() {
HashMap<String, String> map = new HashMap<>();
map.put(MyConstants.HeaderKey.HEADER_1, "header1");
map.put(MyConstants.HeaderKey.HEADER_2, "header2");
return map;
}
/**
* 配置默认Auth:公共get/post请求的url拼接参数。(可选)
*/
@NotNull
@Override
public Map<String, String> getParamsMap() {
HashMap<String, String> map = new HashMap<>();
map.put(MyConstants.ParamsKey.PARAMS_1, "tom");
map.put(MyConstants.ParamsKey.PARAMS_2, "jake");
return map;
}
/**
* 配置默认Auth:公共post请求的通用参数。(可选)
*/
@NotNull
@Override
public Map<String, String> getBodyMap() {
//code...
return super.getBodyMap();
}
/**
* 配置通用Auth默认baseUrl的domain
*/
@NotNull
@Override
public String getBaseUrl() {
// 建议baseUrl以斜杠结尾,避免Retrofit报错
return BuildConfig.DEBUG ? "http://192.168.11.11:1234/" : "http://www.realese.com";
}
/**
* 可传入多个BaseUrl,通过制定Header中Domain-Host字段来区分。(可选)
* @return
*/
@NotNull
@Override
public Map<String, String> getBaseUrls() {
HashMap<String, String> map = new HashMap<>();
map.put("url1", BuildConfig.DEBUG ? "http://111.222.333.444:8888": "http://www.a.com");
map.put("url2", BuildConfig.DEBUG ? "http://555.666.777.888:6666": "http://www.b.com");
return map;
}
/**
* 传入Gson实例。(可选)
* @return
*/
@NotNull
@Override
public Gson getGsonInstance() {
return super.getGsonInstance();
}
});
说明:
1、必须传入:getBaseUrl()中传入默认的baseUrl,当然你可以更灵活地根据debug/release等环境传入不同的地址(需根据业务需求来判断)
2、可选传入:如果存在多个baseUrl,那么请在getBaseUrls()传入一个Map<String,String>。map的key为地址的标识,value为实际地址,key标识将用于区分地址类型。下文会会提到使用方案。当然你可以更灵活地根据debug/release等环境传入不同的地址(需根据业务需求来判断)
注意:
因为Retrofit对baseUrl有规定:
1、对于scheme://host[:port]类型的baseUrl可以不以/(斜线)结尾,
2、对于scheme://host[:port]/path类型的baseUrl必须以/(斜线) 结尾。否则Retrofit会抛出异常。
所以:为避免不必要的异常,建议BaseUrl以/(斜线) 结尾。
public interface JavaTestInterface {
@Headers({"Domain-Host:" + "url1"})
@GET("sales/v1/test/")
Observable<BaseResponse<TestBean>> testRequestGet(
@Query("app_source") String appSource,
@Query("isCustomizeRom") boolean isCustomizeRom,
@Query("versionname") String versionName);
}
说明:
这里如果想动态切换baseUrl,请在Headers中添加请求头,用于标明baseUrl类型key(header字段为:Domain-Host),此类型key在初始化getBaseUrls中已经申明为map的key值。
比如这里申明了:@Headers({"Domain-Host:" + "url1"}),那么baseUrl会替换为getBaseUrls()传入的map中,key="url1"所对应的value
注意:
对于字段地址(这里的"sales/v1/test")请务必采用绝对地址(即不以斜杠开头)。否则会影响到框架对于baseUrl的替换。
同时在实际开发中,我们也强烈建议采用绝对地址,避免不必要的路径错误。
ApiFactory.getApiService(JavaTestInterface.class)
.testRequestGet(app_source, isCustomizeRom, versionname)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new AppObserver<TestBean>(dataCallback));
简易请求方式采用了默认的配置。需要注意的是,此方法内部创建Retrofit工厂时,传入的gson实例采用了项目在初始化中getGsonInstance()获取到的实例(如果初始化时没有初始化getGsonInstance(),则采用空实例(new Gson()),Observer需根据业务需求自行创建。
public static AuthRetrofitFactory myAuthRetrofitFactory
= new AuthRetrofitFactory(App.getInstance(), new JavaNetRequestConfig());
ApiFactory.getApiService(myAuthRetrofitFactory,TestServiceApi.class)
.testRequestGet(app_source, isCustomizeRom, versionname)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new AppObserver<TestBean>(dataCallback));
此方式通过自定义创建Retrofit工厂(AuthRetrofitFactory)来请求网络,更灵活。再此基础上,可以自定义某个网络请求的NetRequestConfigProvider。此处NetRequestConfigProvider的配置会优先于Application中的配置。