Retrofit返回Null但OkHttp拦截器有数据问题排查求助
Retrofit返回null但OkHttp日志有数据的排查方向
1. 数据类与JSON响应的映射校验
- 核对数据类字段名、类型和返回JSON完全匹配:注意大小写、驼峰/下划线差异,必要时加
@SerializedName指定对应JSON字段。比如JSON返回customer_id,数据类字段是customerId的话,必须加@SerializedName("customer_id")。 - 检查嵌套结构一致性:如果JSON是多层嵌套(比如
{"data": {"user": {...}}}),数据类必须对应嵌套层级,不能直接解析内层对象。 - 处理可空字段:JSON中可能为null的字段,数据类要标记为
?可空类型,避免解析失败。 - 配置解析器忽略未知字段:给数据类加
@JsonIgnoreProperties(ignoreUnknown = true)(Gson),或者在解析器构建时开启忽略未知字段,防止接口返回额外字段导致解析失败。
2. Retrofit接口定义检查
- 确认接口方法返回类型正确:比如用
Call<YourDataModel>、suspend fun getCustomer(): YourDataModel,如果返回类型写错(比如Call<Void>),必然得到null。 - 核对请求参数配置:检查
@Body的请求体是否正确,@Headers里的SessionKey是否携带正确(虽然日志有返回,但可能请求参数导致响应结构和预期不符)。 - 对比请求URL:和OkHttp日志里的Request URL对比,确保接口路径完全一致,避免路径错误返回非预期结构的响应。
3. 业务层逻辑排查
- 检查Repository的响应处理:调用Retrofit接口时,必须先判断
response.isSuccessful(),只有成功时response.body()才有效;如果响应码非200-300,要查看response.errorBody()的内容,此时body()会返回null。 - 验证ViewModel的数据流收集:如果用Flow或协程,确保协程正常启动,数据流被正确收集,没有因为生命周期或调度器问题导致数据未传递。
- 添加异常捕获:在Repository的Retrofit调用处加try-catch,打印异常堆栈信息——很多时候解析异常会被吞掉,直接返回null,日志里看不到错误。
4. OkHttp日志细节核对
- 仔细看Response Body的结构:确认是否和数据类匹配,比如有没有外层的
data或result包裹,而你的数据类没对应这个外层结构。 - 检查响应的Content-Type:必须是
application/json,如果是text/plain或其他类型,解析器无法解析JSON,会返回null。 - 确认日志属于当前请求:避免把其他请求的响应日志当成当前请求的,导致判断错误。
5. Retrofit实例初始化验证
- 确认添加了ConverterFactory:构建Retrofit时必须加
GsonConverterFactory.create()(或对应解析器的Factory),没有的话Retrofit无法解析响应体,直接返回null。 - 检查Retrofit实例是否为单例:如果多次构建实例且配置不全(比如漏加ConverterFactory),会导致解析失败。
内容的提问来源于stack exchange,提问作者Dean Ball
相关产品推荐
相关产品推荐

