You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:07:45