Retrofit2 POST请求向服务器发送错误参数值问题求助
哇,这个参数偷偷“变脸”成0的问题确实挺闹心的!我之前排查过类似的坑,大概率是基本数据类型的默认值陷阱在搞鬼,咱们一步步来解决:
1. 先查Retrofit接口的参数类型
这是最常见的原因:如果你在接口里用了int这种基本数据类型,当Retrofit处理参数时,一旦参数传递逻辑出现异常(比如序列化时的隐性转换、或者代码中不小心漏赋值),基本类型会自动用默认值0填充,而不是你期望的-1。
解决方法:换成包装类
把接口里的int类型改成Integer包装类,比如:
// 错误示例(基本类型) @GET("recommendations.php") Call<RecommendResponse> getRecommendations( @Query("maxGradientLo") int maxGradientLo, @Query("totalDistanceLo") int totalDistanceLo, // 其他参数... ); // 正确示例(包装类) @GET("recommendations.php") Call<RecommendResponse> getRecommendations( @Query("maxGradientLo") Integer maxGradientLo, @Query("totalDistanceLo") Integer totalDistanceLo, // 小数参数保持Double即可,它本身就是包装类 @Query("latitude") Double latitude, @Query("longitude") Double longitude );
包装类可以准确保留你传递的-1值,不会被默认值覆盖。
2. 核对参数赋值逻辑
再仔细检查调用接口前的赋值代码,有没有哪里不小心把-1改成了0?比如有没有写反条件的判断:
// 错误示例:条件判断出错导致赋值为0 int totalDistanceLo = someFlag ? -1 : 0; // 如果someFlag的逻辑判断错误,就会意外得到0
建议在调用接口前,再加一行LogD打印所有参数的最终值,确认传递前确实是-1,而不是已经被改成0了。
3. 检查@Query注解的默认值设置
如果你在@Query里手动设置了默认值,比如@Query("totalDistanceLo") int totalDistanceLo = 0,哪怕你传了-1,也可能因为基本类型的特性被覆盖(不过Retrofit的@Query默认值仅在参数为null时生效,但基本类型无法为null,所以这种情况也会导致异常)。
解决方法就是去掉默认值,改用包装类,让参数可以传递null(如果需要的话),或者确保赋值逻辑正确。
4. 排查拦截器/序列化器的干扰
你已经用PHP拦截器看到了参数串异常,那可以检查下有没有自定义的拦截器或者Converter(比如GsonConverter)对参数做了修改?比如有没有配置Gson把-1转换成0的规则?不过这种情况比较少见,但也可以排查下。
一般来说,把基本类型换成包装类就能解决大部分这类问题。如果还是不行,就逐步排查赋值逻辑和序列化环节,应该很快就能找到问题所在!
内容的提问来源于stack exchange,提问作者Shane Monks O'Byrne

