You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:35:01