Retrofit2如何动态更改API端点?
动态更改Retrofit2 API端点的实现方案
当然可以动态切换Retrofit2的API端点,以下是适配你现有代码的几种实用方案:
方案1:使用@Url注解传入完整路径
直接将接口路径作为参数传入,实现最大灵活性:
修改接口方法
// 移除固定的@GET路径,新增@Url参数接收动态端点 fun cmsContents( @Url endpoint: String, @Query("fields") fields: String, @Query("ids") ids: String, @Query("filters") filters: String ): Observable<ContentsDevModel>
修改调用函数
新增参数控制端点切换:
fun getCmsContents( context: Context, observer: Observer<ContentsDevModel>, useProduction: Boolean // 控制是否使用生产端点 ): Subscription { val endpoint = if (useProduction) "/api/v1/contents" else "/api/v1/contents_dev" return create(context) .cmsContents( endpoint, "linkType.linkUrl,image", "89746946", "rain" ) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer) }
调用示例
// 使用生产环境端点 getCmsContents(context, observer, true) // 使用开发环境端点 getCmsContents(context, observer, false)
方案2:使用@Path替换路径后缀
如果仅需切换路径中的_dev后缀,可通过路径参数实现:
修改接口方法
@GET("/api/v1/contents{envSuffix}") fun cmsContents( @Path("envSuffix") envSuffix: String, @Query("fields") fields: String, @Query("ids") ids: String, @Query("filters") filters: String ): Observable<ContentsDevModel>
修改调用函数
fun getCmsContents( context: Context, observer: Observer<ContentsDevModel>, useProduction: Boolean ): Subscription { val envSuffix = if (useProduction) "" else "_dev" return create(context) .cmsContents( envSuffix, "linkType.linkUrl,image", "89746946", "rain" ) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer) }
方案3:全局动态修改Base URL(适合全接口环境切换)
如果需要全局切换所有接口的环境,可在创建Retrofit实例时动态设置Base URL:
修改Retrofit创建方法
fun create(context: Context, useProduction: Boolean): YourApiInterface { val baseUrl = "https://your-domain.com/api/v1/" val retrofit = Retrofit.Builder() .baseUrl(baseUrl) // 配置Converter、CallAdapter等 .build() return retrofit.create(YourApiInterface::class.java) }
适配接口方法
将接口方法调整为配合Base URL的动态路径:
@GET("contents{envSuffix}") fun cmsContents( @Path("envSuffix") envSuffix: String, @Query("fields") fields: String, @Query("ids") ids: String, @Query("filters") filters: String ): Observable<ContentsDevModel>
修改调用函数
fun getCmsContents( context: Context, observer: Observer<ContentsDevModel>, useProduction: Boolean ): Subscription { val envSuffix = if (useProduction) "" else "_dev" return create(context, useProduction) .cmsContents( envSuffix, "linkType.linkUrl,image", "89746946", "rain" ) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer) }
内容的提问来源于stack exchange,提问作者Lazy Ninja
相关产品推荐
相关产品推荐

