Android多Variant下Retrofit传完整BaseUrl时@GET空值无效求助
问题解决:Retrofit中baseUrl传完整URL时@GET("")无效的问题
首先明确:直接给baseUrl()传完整接口URL,同时@GET留空的方式不符合Retrofit的设计规范,大概率会因为URL解析逻辑出错导致请求失败,下面给你具体的原因和适配你多Variant场景的解决方案。
核心原因:Retrofit的URL拼接规则
Retrofit对baseUrl和注解中的路径有严格的解析逻辑:
baseUrl必须是一个基础路径,且要求以/结尾,比如https://debug-api.example.com/;- @GET、@POST等注解中的字符串是接口的相对路径,会和
baseUrl拼接成完整请求地址。
如果你把完整的接口URL(比如https://debug-api.example.com/user/list)传到baseUrl(),再给@GET留空,Retrofit会把这个完整URL当成基础路径,后续的解析逻辑会混乱,导致请求地址不符合预期。
适配多Variant的正确做法
你的场景是不同Variant对应不同的基础域名/路径,完全可以通过BuildConfig配合标准的Retrofit用法实现:
1. 修正Gradle中的BaseUrl配置
确保每个Variant的BASE_URL都是带/结尾的基础路径,比如在Module的build.gradle中:
android { buildTypes { debug { buildConfigField "String", "BASE_URL", "\"https://debug-api.yourdomain.com/\"" } release { buildConfigField "String", "BASE_URL", "\"https://release-api.yourdomain.com/\"" } } }
2. 标准的Retrofit接口定义
在接口中用@GET填写具体的接口相对路径,初始化Retrofit时传入BuildConfig.BASE_URL:
public interface ApiService { // 相对路径和baseUrl拼接成完整地址:https://xxx.yourdomain.com/user/profile @GET("user/profile") Call<UserProfile> getUserProfile(); @GET("articles/list") Call<List<Article>> getArticleList(); } // 初始化Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class);
特殊场景:需要调用完整URL的接口
如果某个接口必须使用独立的完整URL(不基于baseUrl),不要用@GET("")的方式,改用@Url注解:
public interface ApiService { @GET Call<ResponseBody> callFullUrl(@Url String fullUrl); } // 调用时传入BuildConfig中配置的完整URL apiService.callFullUrl(BuildConfig.SPECIAL_FULL_URL);
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

