Retrofit+Moshi发起POST请求时access_token缺失异常排查
排查
JsonDataException: Required value 'access_token' missing 问题的步骤 1. 核对响应实体类与接口返回JSON的匹配度
- 确保
RegisterDto里的access_token字段和Postman返回的JSON键名完全一致(大小写、下划线/驼峰都不能错)。如果接口返回的是"access_token",实体类写成accessToken的话,必须加@Json(name = "access_token")注解映射。 - 检查字段的非空设置:如果接口允许
access_token为空或不存在,实体类里要把该字段设为可空类型——Kotlin用val access_token: String?,Java去掉@NonNull注解。 - 确认JSON层级:要是Postman返回的是嵌套结构(比如
{"data": {"access_token": "xxx"}}),但RegisterDto直接定义了access_token,肯定会找不到字段,必须让实体类和JSON结构完全对应。
2. 检查Moshi配置是否生效
- Retrofit构建时,
MoshiConverterFactory要放在第一个转换器位置,避免被其他Converter干扰:Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(MoshiConverterFactory.create(moshiInstance)) .client(okHttpClient) .build() - Kotlin项目必须添加Kotlin适配器,否则data class无法正常序列化/反序列化:
val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .build()
3. 打印完整响应体验证实际返回数据
- 给OkHttp加日志拦截器,直接看接口返回的原始JSON,确认是否真的包含
access_token:
看Logcat里的val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build()OkHttp标签日志,就能知道是接口返回数据不对,还是实体类解析错了。
4. 确认请求侧的序列化是否正常
- 检查
RegisterDataModel的字段是否和接口要求的参数名一致,同样注意大小写和注解。 - 核对
RegisterService的POST方法定义:@Body注解是否正确使用,请求URL、请求头(比如Content-Type)是否和Postman一致,避免请求发送失败后接口返回错误格式的响应。
5. 解决日志未打印的问题
- 确保HttpLoggingInterceptor的level设为
Level.BODY,且已添加到OkHttpClient中。 - 检查Logcat的过滤条件,别把
OkHttp标签的日志过滤掉了。 - 确认AndroidManifest.xml里加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />。
内容的提问来源于stack exchange,提问作者NewPartizal
相关产品推荐
相关产品推荐

