项目中有时候会遇到多个 BaseUrl 的场景或者动态改变 BaseUrl 的场景
比如使用到多个三方服务提供商,图片的读取使用到一个服务商,文件的存储又使用到另一个服务商,这会存在一个 App 出现多个 BaseUrl。如果项目的 BaseUrl 会在 App 启动时,请求服务器,根据服务器的返回结果,来确定项目最终的 BaseUrl,就会涉及到运行时动态切换 BaseUrl
静态解决方案
@Get , @Post 这些标注到每个接口方法上的注解不仅可以传相对路径,还可以传全路径,这样我们就可以做到不同的接口使用不同的 BaseUrl ,从而达到使用多个 BaseUrl 的需求,但是注解上的值只能是 Final 的常量,不能动态改变
动态解决方案
@Url 这个标注到每个接口方法参数上的注解,它可以将全路径作为参数传进接口作为每次请求的 Url 地址,每次请求接口都可以将不同的全路径作为参数,从而达到支持多个 BaseUrl 以及在运行时动态改变 BaseUrl
其它解决方案
不同的 BaseUrl 使用不同的 Retrofit 对象来创建 ApiService 进行请求,这样只要新增一个不同的 BaseUrl ,那就需要重新创建一个新的 Retrofit 对象。创建多个其他配置属性一模一样,只是 BaseUrl 不一样的 Retrofit 对象,太过于浪费资源
或者利用 Interceptor 拦截器,动态改变每个 Request 的 Url 从而实现动态改变 BaseUrl,但他这个解决方案不能支持多 BaseUrl ,只要 host 一设置,直到下一次改变 Host 之前,后面的所有 Request 都必须使用同一个 Host