Retrofit中空值查询参数无法从URL移除的问题求助
解决Retrofit中空查询参数自动移除的问题
核心原因
Retrofit 默认会忽略 null 类型的@Query参数,但不会忽略空字符串"",所以空字符串会被拼到URL里生成lastName=这类无效参数。下面是几种直接可行的解决方案:
方案1:将可选参数改为可空类型,调用时转换空字符串为null
这是最简洁的处理方式,直接修改接口参数类型,调用前把空字符串转为null即可。
修改后的接口代码
@GET("entriesAcceptance/v${Constants.API_VERSION}/param1/{param1Value}/param2/{param2Value}/entries") suspend fun getEntries( @Path("param1Value") param1Value: String, @Path("param2Value") param2Value: String, @Query("firstName") firstName: String, @Query("lastName") lastName: String? // 改为可空类型 ): EntriesResponse
注意:原代码中
@Path的参数名与路径占位符不匹配(@Path("param1")对应{param1Value}),已修正为@Path("param1Value"),避免运行时报错。
调用时处理参数
// 把空字符串转为null,传给接口 val lastNameParam = if (lastName.isEmpty()) null else lastName apiService.getEntries(param1Value, param2Value, firstName, lastNameParam)
此时如果lastName为空,Retrofit会自动跳过该参数,不会拼到URL里。
方案2:使用@QueryMap传递可选参数
如果有多个可选参数,用@QueryMap可以更灵活地控制哪些参数被加入URL。
修改后的接口代码
@GET("entriesAcceptance/v${Constants.API_VERSION}/param1/{param1Value}/param2/{param2Value}/entries") suspend fun getEntries( @Path("param1Value") param1Value: String, @Path("param2Value") param2Value: String, @Query("firstName") firstName: String, @QueryMap queryMap: Map<String, String> ): EntriesResponse
调用时构建参数Map
val queryMap = mutableMapOf<String, String>() // 仅当lastName非空时加入Map if (lastName.isNotEmpty()) { queryMap["lastName"] = lastName } // 后续如果有其他可选参数,同样按此规则添加 apiService.getEntries(param1Value, param2Value, firstName, queryMap)
内容的提问来源于stack exchange,提问作者Anshul Tyagi
相关产品推荐
相关产品推荐

