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

Retrofit高版本POST请求带String查询参数时URL异常求助

解决Retrofit 2.2.0+中@Query参数名被截断的问题

哈哈,这个坑我之前踩过!你遇到的情况是Retrofit升级到2.2.0及以上版本后,@Query注解的参数名被混淆成了单个字符(比如你看到的n...),才生成了错误的URL。

核心原因

问题大概率出在ProGuard代码混淆上!Retrofit 2.2.0之后的版本,对注解参数名的获取逻辑做了调整——旧版本可能还能保留原始参数名,但新版本如果没有配置正确的混淆规则,ProGuard会把方法的参数名(比如name)混淆成无意义的短字符,导致Retrofit生成URL时只能识别到被混淆后的单个字符。

快速解决方案

在你的proguard-rules.pro配置文件里加上这些规则,确保Retrofit的注解和参数名不被混淆:

# 保留Retrofit核心类和注解
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

# 保留带有Retrofit网络注解的方法参数名
-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}

# 如果你用Gson做转换器,记得保留实体类(替换成你自己的实体包路径)
-keep class com.yourproject.model.** { *; }

把com.yourproject.model换成你项目里Cities这类实体类所在的包名就行。

额外排查点

如果加了规则还是没好,可以再检查这几个地方:

  • 确认Base URL的配置:要么Base URL末尾不加斜杠,要么@POST的路径不以斜杠开头,保持统一避免拼接错误
  • 看看有没有自定义的OkHttp拦截器,是不是不小心修改了URL的查询参数
  • 清理项目缓存后重新构建,确保混淆规则生效

这样调整完,Retrofit就能正确识别@Query("name")里的参数名,生成searchCity/byname?name=City这种正常的URL啦。

内容的提问来源于stack exchange,提问作者Rodri de Blas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:36:23