开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2天,点击查看活动详情
相信做Android开发的兄弟们一定遇到过多BaseUrl的情况吧,如果说只有一两个BaseUrl那很好解决,单独配置一个Retrofit即可。但往往美好的事情都发生在别人身上,一个项目四五个BaseUrl时有发生,甚至更甚。这时不可能有一个BaseUrl就写一个Retrofit吧(臃肿且需要管理),那么有没有某种方式可以动态更改BaseUrl的呢?
方案1:通过第三方工具配置——RetrofitUrlManager
首先在项目中添加依赖:
implementation 'me.jessyan:retrofit-url-manager:1.4.0'
初始化OkHttpClient,这里返回的OkHttpClient作为原有Retrofit配置的入参
OkHttpClient okHttpClient = RetrofitUrlManager.getInstance().with(new OkHttpClient.Builder())
.build();
接口上添加@Headers注解,参数其实就是一个键值对形式的字符串,以Domain-Name为键douban为值传入
//仅用于单个接口
public interface ApiService {
@Headers({"Domain-Name: douban"})
@GET("/v2/book/{id}")
Observable<ResponseBody> getBook(@Path("id") int id);
}
这里提供了两种方案:
1.修改单个接口putDomain()
2.修改全局接口setGlobalDomain()
//修改单个接口BaseUrl(第一个参数必须和接口Headers注解内的字段保持一致)
RetrofitUrlManager.getInstance().putDomain("douban", "https://api.douban.com");
//修改全局BaseUrl
RetrofitUrlManager.getInstance().setGlobalDomain("your BaseUrl");
方案2:通过Retrofit2注解——@Url
Retrofit本身提供了很多注解,在网络请求中使用的诸如GET、POST、PUT、DELETE之类的其实也可入参完整地址,但有个缺点是注解上的值只能是 Final常量,不能动态改变。
这里介绍下@Url注解使用方法:
@POST
suspend fun getData(@Url url: String, @Body requestBody: RequestBody): BaseBean
是的,你没看错,如此简单直白,入参url填写请求地址即可。真正做到了动态配置,官方一出手,就问有没有!
总结:
以上两种方案都可修改BaseUrl,但各有优缺点。
方案1:
优点:配置请求接口即可做好标记,可动态修改任意接口或全局接口BaseUrl且仅配置一次
缺点:需要添加三方库,可能会有意想不到的bug(例如全局配置后图片加载会受影响等,当然也有解决方案)
方案2:
优点:使用简单、方便,无需添加额外库
缺点:每次都需要入参url,如遇动态url还不能管理该类url
以上是动态BaseUrl的2个解决方案,目前基本足够使用。大家可根据自身项目情况选择对应方案即可,另有其他方案还请留言告知,相互学习!
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2天,点击查看活动详情