Skip to content

Use annotation to allow Retrofit to support multiple baseUrl and dynamically change baseUrl.(用注解让 Retrofit 同时支持多个 baseUrl 以及动态改变 baseUrl)

Notifications You must be signed in to change notification settings

DylanCaiCoding/MultiBaseUrls

Repository files navigation

GitHub Repo stars

用注解让 Retrofit 同时支持多个 baseUrl 以及动态改变 baseUrl

Features

  • 支持多种用 @BaseUrl 注解修改 baseUrl 的方式
  • 支持用 globalBaseUrl 修改全局的 baseUrl
  • 优先使用 @Url 修饰的全路径参数的 baseUrl

Gradle

settings.gradle 文件的 repositories 结尾处添加:

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    mavenCentral()
    maven { url 'https://www.jitpack.io' }
  }
}

或者在 settings.gradle.ktx 文件的 repositories 结尾处添加:

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    mavenCentral()
    maven { url = uri("https://jitpack.io") }
  }
}

添加依赖:

dependencies {
  implementation("com.github.DylanCaiCoding:MultiBaseUrls:1.0.0")
}

Usage

初始化

Kotlin

val okHttpClient = OkHttpClient.Builder()
  .enableMultiBaseUrls()
  // ...
  .build()

Java

OkHttpClient okHttpClient = MultiBaseUrls.with(new OkHttpClient.Builder())
  // ...
  .build();

支持多个 baseUrl

使用 @BaseUrl 注解修改接口类里所有请求的 baseUrl。

Kotlin

@BaseUrl("https://xxxxxx.com/")
interface Api {
  // ...
}

Java

@BaseUrl("https://xxxxxx.com/")
public interface Api {
  // ...
}

动态修改 baseUrl

如果有运行时动态修改 baseUrl 的需求,可以修改全局的 globalBaseUrl,比如:

Kotlin

globalBaseUrl = "https://xxxxxx.com/"

Java

MultiBaseUrls.setGlobalBaseUrl("https://xxxxxx.com/");

如果是有多个 baseUrl 需要在运行时动态修改,那就用 @BaseUrl 配置一个 key,用 dynamicBaseUrls[key] 动态修改 baseUrl。比如:

Kotlin

@BaseUrl(key = "url1")
interface Api {
  @GET("/aaa/bbb")
  @BaseUrl(key = "url2")
  suspend fun request(): String
}

dynamicBaseUrls[url1] = "https://xxxxxx.com/v2/"
dynamicBaseUrls[url2] = "https://xxxxxx.com/v3/"

Java

@BaseUrl(key = "url1")
public interface Api {
  @GET("/aaa/bbb")
  @BaseUrl(key = "url2")
  Single<String> request();
}

MultiBaseUrls.getDynamicBaseUrls().put("url1", "https://xxxxxx.com/v2/");
MultiBaseUrls.getDynamicBaseUrls().put("url2", "https://xxxxxx.com/v3/");

替换 baseUrl 规则

遵循以下规则:

  • @Url 注解的全路径参数优先级最高
  • 动态域名的优先级高于静态域名
  • 函数注解的优先级高于类的注解

所以多个注解一起使用的情况按照下面的方式处理:

  1. 读取函数上的 @Url 注解修饰的参数,如果参数传入的是全路径地址,那就直接使用该地址;
  2. 读取函数上的 @BaseUrl 注解,如果有配置 key,并且 dynamicBaseUrls 里有对应的域名,那就使用该域名;
  3. 读取类上的 @BaseUrl 注解,如果有配置 key,并且 dynamicBaseUrls 里有对应的域名,那就使用该域名;
  4. 读取函数上的 @BaseUrl 注解,如果有配置 value 为一个域名,那就使用该域名;
  5. 读取类上的 @BaseUrl 注解,如果有配置 value 为一个域名,那就使用该域名;
  6. 读取 globalBaseUrl 变量,如果有配置全局域名,那就使用该域名;
  7. 使用 Retrofit 创建时配置的 baseUrl;

更新日志

Releases

License

Copyright (C) 2024. Dylan Cai

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Use annotation to allow Retrofit to support multiple baseUrl and dynamically change baseUrl.(用注解让 Retrofit 同时支持多个 baseUrl 以及动态改变 baseUrl)

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages