使用Retrofit请求API部分非空参数返回null、Postman正常如何解决
问题解决方案
1. 先确认Retrofit拿到的原始响应和Postman一致
你需要先添加OkHttp日志拦截器,打印完整的响应报文,排除请求头、参数差异导致服务端返回不同内容的情况:
- 首先引入日志拦截器依赖(module层级的build.gradle):
implementation 'com.squareup.okhttp3:logging-interceptor:4.11.0'
- 修改OkHttpClient配置,添加日志拦截器:
val logInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val client1 = OkHttpClient.Builder() .addInterceptor(logInterceptor) .addInterceptor(SigningInterceptor(consumer)) .build()
运行后查看Logcat的响应体,和Postman返回的内容对比,如果内容不一致,优先排查请求头、参数的差异。
2. 处理JSON字段名与模型类字段不匹配的问题
这是此类问题最常见的诱因:默认Gson是严格匹配字段名的,如果接口返回的是下划线命名(如generated_at、preview_url_42),而你的模型类用的是驼峰命名,就会解析失败返回null。
解决方法二选一:
- 方案1:给模型类字段加
@SerializedName注解,显式指定对应JSON字段名:
public class ApiData{ private int total; @SerializedName("generated_at") private String generatedAt; private Collection collection; private List<IconsItem> icons; // 其余代码不变 }
IconsItem等其余实体类的字段同理,逐个匹配接口返回的字段名添加注解。
- 方案2:全局配置Gson的字段命名转换策略,自动把下划线命名转驼峰:
修改Retrofit初始化时的Gson配置:
val gson = GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create() var retrofit : Retrofit = Retrofit.Builder() .baseUrl(BaseUrl) .client(client1) .addConverterFactory(GsonConverterFactory.create(gson)) .build()
该方案无需逐个给字段加注解,适合整体都是下划线转驼峰的场景。
3. 检查混淆配置
如果你开启了代码混淆(R8/ProGuard),需要在proguard-rules.pro中添加实体类的保活规则,避免字段名被混淆后无法匹配JSON字段:
-keep class 你的实体类所在包名.** { *; } # 配套添加Gson通用混淆规则 -keep class com.google.gson.** {*;} -keepnames class * implements java.io.Serializable -keepattributes Signature -keepattributes *Annotation*
4. 校验字段类型匹配
检查模型类字段的类型是否和接口返回的一致:
- 如接口返回的布尔类型字段(true/false)不要定义为String类型
- 可能为空的数值类型不要用基础类型(如int、long),改用包装类型(Integer、Long),避免解析失败赋值为默认值
- 复杂对象类型(如Sponsor、Uploader)的内部字段也要按上述规则检查
内容的提问来源于stack exchange,提问作者Shrey Srivastava
相关产品推荐
相关产品推荐

