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
相关产品推荐
相关产品推荐

