Moshi报Required value missing错误时如何查看接口返回的原始数据
问题描述
使用新API时经常遇到如下Moshi序列化报错:
com.squareup.moshi.JsonDataException: Required value 'X' (JSON name 'x') missing at $ at com.squareup.moshi.internal.Util.missingProperty(Util.java:649) at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapter.fromJson(KotlinJsonAdapter.kt:103) at com.squareup.moshi.internal.NullSafeJsonAdapter.fromJson(NullSafeJsonAdapter.java:41) at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:46) at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:27) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243) at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153) at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923)
需要获取接口返回的原始数据,判断是接口确实缺失字段x,还是返回了其他异常结构,之前尝试配置OkHttp日志拦截器未生效,寻求可靠的获取原始响应的方法。
解决方案
方案1:使用Web调试代理工具(最直接无侵入)
使用Charles Proxy这类本地代理工具抓包是最直接的解决方案,不需要修改任何项目代码,即可完整捕获本次请求的所有原始信息:包括请求头、请求参数、响应头、原始响应体,不受项目内部序列化逻辑、拦截器配置错误的影响。
操作逻辑:电脑和移动端设备连接同一局域网,将移动端的代理指向电脑的IP+Charles监听端口,安装并信任Charles的SSL证书后,即可直接查看对应API的完整返回内容。方案2:修正OkHttp日志拦截器配置(适合不想额外安装工具的场景)
日志拦截器不生效大多是因为拦截器顺序错误、日志级别配置不对,正确配置方式如下:
首先确保引入了正确的日志拦截器依赖,然后在构建OkHttpClient实例时,将HttpLoggingInterceptor设置为网络拦截器,并且将日志级别设为BODY,示例代码:
val loggingInterceptor = HttpLoggingInterceptor().apply { // 必须设置为BODY级别才能打印完整的请求、响应内容 level = HttpLoggingInterceptor.Level.BODY } val okHttpClient = OkHttpClient.Builder() // 注意要放在其他自定义拦截器之前,避免打印被其他拦截器修改后的数据 .addNetworkInterceptor(loggingInterceptor) // 其余配置:超时时间、其他自定义拦截器等 .build()
配置完成后重新运行项目,即可在Logcat中看到对应请求的完整原始响应内容。
内容的提问来源于stack exchange,提问作者Barrufet
相关产品推荐
相关产品推荐

