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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:08:20