Skip to content

MrLeeBean/LeeNet

Repository files navigation

LeeNet:网络请求库

写在前边

本框架集成Retrofit+RxJava整合框架,可以简单便捷地进行网络请求。

一、框架结构

二、集成方式

1.引入。

步骤1:在项目根目录的 build.gradle 中添加:

allprojects {
	repositories {
		...
		maven { url 'https://www.jitpack.io' }
	}
}

步骤2. 在项目app的 build.gradle 的 dependencies 中添加:

dependencies {
         implementation 'com.github.MrLeeBean:LeeNet:0.0.1'
}

版本号 一般采用Tag中最新的版本。

2.初始化。

请在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();
                }

                /**
                 * FileProvider定义
                 */
                @Override
                public String getFileProviderAuthority() {
                    return MyConstants.Authority.FILE_AUTHORITY;
                }
            })
            .requestConfig(new NetRequestConfigProvider() {

                /**
                 * 配置默认Auth:公共请求header。(可选)
                 */
                @Override
                public Map 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拼接参数。(可选)
                 */
                @Override
                public Map 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请求的通用参数。(可选)
                 */
                @Override
                public Map getBodyMap() {
                    //code...
                    return null;
                }

                /**
                 * 配置通用Auth默认baseUrl的domain
                 */
                @Override
                public String getBaseUrl() {
                    // 建议baseUrl以斜杠结尾,避免Retrofit报错
                    return BuildConfig.DEBUG ? "http://192.168.11.11:1234/" : "http://www.realese.com";
                }

                /**
                 * 可传入多个BaseUrl,通过制定Header中Domain-Host字段来区分。(可选)
                 * @return
                 */
                @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
                 */
                @Override
                public Gson getGsonInstance() {
                    return null;
                }

            });

说明:

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以/(斜线) 结尾。

3.网络请求

3.1创建InterfaceApi。

public interface TestServiceApi {

    @Headers({"Domain-Host:" + "url1"})// 加上 Domain-Host header
    @GET(sales/v1/test/)
    Observable<BaseResponse<CheckRomBean>> testRequestGet(@Query("app_source") String app_source, @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的替换。

同时在实际开发中,我们也强烈建议采用绝对地址,避免不必要的路径错误。

3.2执行网络请求。

1、简易请求方式:
ApiFactory.getApiService(TestServiceApi.class)
                .testRequestGet(app_source, isCustomizeRom, versionname)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new MyObserver<CheckRomBean>(dataCallback));

简易请求方式采用了所有默认的配置(注意gson实例将无法自定义,如果对通过gson处理javabean格式有需求的,请不要采用此方式),Observer需根据业务需求自行创建。

2、扩展请求方式:
AuthRetrofitFactory factory = new AuthRetrofitFactory(MyApplication.getInstance());
TestServiceApi testServiceApi = factory.create().create(TestServiceApi.class);

testServiceApi
            .testRequestGet(app_source, isCustomizeRom, versionname)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new MyObserver<CheckRomBean>(dataCallback));

此方式通过自定义创建Retrofit工厂(AuthRetrofitFactory)来请求网络,更灵活。其实ApiFactory内部也是维护了一个Retrofit工厂。

同时Retrofit工厂也可以传入baseUrl来创建ApiInterface实例,如下::

TestServiceApi testServiceApi = factory.create("http://123.445.666.777:8980/").create(TestServiceApi.class);

无论上述那种方式请求网络,都可以实现baseUrl的动态替换、公参加入等完整功能。

4、开发计划和进度

开发进度:

1、整体框架大致完成(OK)

2、get/post请求开发完成(OK)

未完成:

1、下载上传(ing...)

思考:

1、是否使用公共参数/请求头可通过请求头动态配置

2、新参数无法覆盖默认配置的参数,由于系统原因导致的问题。思考解决方案。

3、网络请求生命周期的控制和收尾

4、外部增加对OkHttpClient的扩展

5、OkHttpClient可以使用一个单例的思考