Retrofit请求报错:Expected BEGIN_OBJECT but was STRING求助
问题排查方案
1. 验证请求URL有效性
- 直接在浏览器或Postman中访问
https://randomuser.me/api,确认返回内容是否为标准JSON。若返回HTML,先排查URL拼写(比如是否多了空格、后缀错误),或是否存在域名重定向(比如地区限制、服务商临时跳转)。 - 检查代码中BASE_URL的拼接逻辑,确认接口注解中的路径没有多余字符或拼接错误。
2. 检查请求头配置
- 确认Retrofit请求是否携带
Accept: application/json头,部分API会根据该头返回对应格式内容,未指定时可能默认返回HTML。 - 排查Dagger注入的ApiClient是否全局添加了错误的请求头,导致API识别请求格式异常。
3. 排查网络拦截/代理问题
- 检查设备是否开启了Charles、Fiddler等代理工具,代理配置错误可能导致请求被篡改,返回代理的错误提示HTML页面。
- 查看App自定义的网络Interceptor,确认是否存在误修改请求或响应内容的逻辑,比如将响应体替换为HTML。
4. 确认API服务状态
- 查看API官方状态页(若有),确认是否存在临时维护、故障,导致返回错误页面而非正常JSON。
- 切换网络环境(比如从WiFi切到移动数据),排除运营商缓存或网络劫持导致的HTML返回。
5. 打印完整请求响应日志
- 给OkHttp添加日志拦截器,打印完整的请求URL、请求头、响应状态码、响应体,定位问题根源:
val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build() - 从日志中重点确认:响应状态码是否为200系列(4xx/5xx状态码大概率对应错误HTML页面),响应体是否确实为HTML内容。
6. 增加异常兼容处理
- 暂时将API接口返回类型改为
ResponseBody,手动判断响应内容:@GET("api") suspend fun getUser(): Response<ResponseBody> - 调用时先检查
response.isSuccessful,读取响应体字符串后判断是否为JSON格式,再手动解析为UserModel,避免直接崩溃。
内容的提问来源于stack exchange,提问作者Manuel Lucas
相关产品推荐
相关产品推荐

