# 网络框架 **Repository Path**: android2014/network-framework ## Basic Information - **Project Name**: 网络框架 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-14 - **Last Updated**: 2024-06-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: retrofit ## README # 网络框架 #### 介绍 {**以下是 Gitee 平台说明,您可以替换此简介** Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 ### 1、在application类里边进行初始化配置 > ##### 在自己的Application的onCreate方法中进行初始化配置 ``` public class MyApplication extends Application { Map headerMaps = new HashMap<>(); @Override public void onCreate() { super.onCreate(); RetrofitCache.getInstance().init(this);//缓存 OkHttpClient okHttpClient = new OkHttpConfig .Builder(this) //全局的请求头信息 .setHeaders(new BuildHeadersListener() { @Override public Map buildHeaders() { HashMap hashMap = new HashMap<>(); hashMap.put("appVersion", BuildConfig.VERSION_NAME); hashMap.put("client", "android"); hashMap.put("token", "your_token"); hashMap.put("other_header", URLEncoder.encode("中文需要转码")); return hashMap; } }) //开启缓存策略(默认false) //1、在有网络的时候,先去读缓存,缓存时间到了,再去访问网络获取数据; //2、在没有网络的时候,去读缓存中的数据。 .setCache(true) .setHasNetCacheTime(10)//默认有网络时候缓存60秒 .setNoNetCacheTime(3600)//默认有网络时候缓存3600秒 //全局持久话cookie,保存到内存(new MemoryCookieStore())或者保存到本地(new SPCookieStore(this)) //不设置的话,默认不对cookie做处理 .setCookieType(new SPCookieStore(this)) //可以添加自己的拦截器(比如使用自己熟悉三方的缓存库等等) //.setAddInterceptor(null) //全局ssl证书认证 //1、信任所有证书,不安全有风险(默认信任所有证书) //.setSslSocketFactory() //2、使用预埋证书,校验服务端证书(自签名证书) //.setSslSocketFactory(cerInputStream) //3、使用bks证书和密码管理客户端证书(双向认证),使用预埋证书,校验服务端证书(自签名证书) //.setSslSocketFactory(bksInputStream,"123456",cerInputStream) //全局超时配置 .setReadTimeout(10) //全局超时配置 .setWriteTimeout(10) //全局超时配置 .setConnectTimeout(10) //全局是否打开请求log日志 .setDebug(true) .build(); RetrofitUrlManager.getInstance().putDomain(GITHUB_DOMAIN_NAME, APP_GITHUB_DOMAIN); RetrofitUrlManager.getInstance().putDomain(GANK_DOMAIN_NAME, APP_GANK_DOMAIN); RetrofitUrlManager.getInstance().putDomain(DOUBAN_DOMAIN_NAME, APP_DOUBAN_DOMAIN); RxHttpUtils .getInstance() .init(this) .config() //使用自定义factory的用法 //.setCallAdapterFactory(RxJava2CallAdapterFactory.create()) //.setConverterFactory(ScalarsConverterFactory.create(),GsonConverterFactory.create(GsonAdapter.buildGson())) //配置全局baseUrl .setBaseUrl("https://api.douban.com/") //开启全局配置 .setOkClient(okHttpClient); } } ``` ### 2、默认已实现三种数据格式 * 1、CommonObserver (直接写自己的实体类即可,不用继承任何base) * 2、StringObserver (直接String接收数据) * 3、DataObserver (适合{"code":200,"msg":"描述",data:{}}这样的格式,需要使用BaseData<T> ,其中T为data中的数据模型) > 如果以上三种不能满足你的需要,可以分别继承对应的baseObserver方法实现自己的逻辑 # 代码实例 > ## 使用Application里边的全局配置的参数 ### 2.1、使用CommonObserver请求示例 ``` a、 数据结构 { "code": 0, "msg": "success", "username":"Allen", "job":"Android", ... } 备注:TestBean为以上数据结构的模型 b、 @GET("api/test") Observable getTestData(); c、 RxHttpUtils .createApi(ApiService.class) .getTestData() .compose(Transformer.switchSchedulers()) .subscribe(new CommonObserver() { @Override protected void onError(String errorMsg) { //错误处理 } @Override protected void onSuccess(TestBean bookBean) { //业务处理 } }); ``` ### 2.2、使用DataObserver请求示例 ``` a、 数据结构 { "code":0, "msg":"success", "data":{ "username":"Allen", "job":"Android Dev" ... } } 备注:TestBean为data中的数据模型 b、 @GET("api/test") Observable> geTestData(); c、 RxHttpUtils.createApi(ApiServer.class) .geTestData() .compose(Transformer.>switchSchedulers()) .subscribe(new DataObserver() { @Override protected void onError(String errorMsg) { } @Override protected void onSuccess(TestBean data) { } }); ``` ### 2.3、使用StringObserver请求示例 ``` a、 @GET("api/test") Observable geTestData(); b、 RxHttpUtils.createApi(ApiServer.class) .geTestData() .compose(Transformer.switchSchedulers()) .subscribe(new StringObserver() { @Override protected void onError(String errorMsg) { } @Override protected void onSuccess(String data) { } }); ``` ### 2.4、链式请求示例--请求参数是上个请求的结果 ``` RxHttpUtils .createApi(ApiService.class) .getBook() .flatMap(new Function>() { @Override public ObservableSource apply(@NonNull BookBean bookBean) throws Exception { return RxHttpUtils .createApi(ApiService.class) .getTop250(20); } }) .compose(Transformer.switchSchedulers(loading_dialog)) .subscribe(new CommonObserver() { @Override protected void onError(String errorMsg) { //错误处理 } @Override protected void onSuccess(Top250Bean top250Bean) { //业务处理 } }); ``` # 3、多baseUrl使用说明 > ### 动态切换全局单个baseUrl的方法 ``` RxUrlManager.getInstance().clear().setUrl("baseUrl"); ``` ### 3.1、使用不同的baseUrl发送请求 ``` 创建格式如下 RxHttpUtils.createApi("xxxUrlKey", "xxxUrlValue", xxxApi.class) 以下是demo中示例的三个不同baseUrl的使用方法 RxHttpUtils.createApi(AppUrlConfig.DOUBAN_KEY, AppUrlConfig.DOUBAN_URL, DouBanApi.class) RxHttpUtils.createApi(AppUrlConfig.WANANDROID_KET, AppUrlConfig.WANANDROID_URL, WanAndroidApi.class) RxHttpUtils.createApi(AppUrlConfig.OTHER_OPEN_KEY, AppUrlConfig.OTHER_OPEN_URL, OtherOpenApi.class) ``` ### 3.2、不同的baseUrl可以定制retrofit相关参数 ``` ApiFactory.getInstance().setConverterFactory(...).setCallAdapterFactory(...).setOkClient(...).createApi(...) ``` ### 3.3、注意事项:RxHttpUtils是对ApiFactory的封装,两种写法都可以 ``` 1、全局配置并且唯一baseUrl的两种写法如下 ①、RxHttpUtils.createApi(XXXApi.class) ②、ApiFactory.getInstance().createApi(XXXApi.class) 2、多个baseUrl两种写法如下 ①、RxHttpUtils.createApi("xxxUrlKey", "xxxUrlValue", XXXApi.class) ②、ApiFactory.getInstance().createApi("xxxUrlKey", "xxxUrlValue", XXXApi.class) ``` ### 3.4、温馨提示 > #### 一般情况下某一个baseUrl下会有很多不同的请求,每次都写一遍3.3中提到的写法的话代码重复太多,建议对不同的baseUrl进行提取,具体可参照demo中ApiHelper的写法 ``` /** * Copyright (C), 2015-2024, XXX有限公司 * FileName: NetWorkManager * Author: chenchen * Date: 2024/6/14 10:15 * Description: * History: *