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

登出接口返回204 No Content时Retrofit触发异常该如何处理?

问题原因
  • Retrofit默认的响应转换器(如GsonConverter、kotlinx序列化转换器)会尝试将服务端返回的响应体解析为接口声明的返回类型。当服务端返回204 No Content时响应体为空,转换器无法从空数据流中解析出对应类型的对象,就会抛出解析异常,哪怕请求本身已经执行成功。
  • 你当前的接口方法没有显式声明返回类型为Response类,Retrofit会自动触发响应体解析逻辑,因此204响应会直接触发catch分支。
解决方案

方案1:修改接口返回类型为Response<Unit>(最推荐)

显式声明返回Response<Unit>后,Retrofit不会自动解析响应体,你可以自行判断响应状态码,所有2xx范围内的状态码都会被判定为请求成功,完美适配204无内容的场景。

  1. 修改API接口定义:
@POST("logout")
suspend fun logout(@Header("Authorization") token: String): Response<Unit>
  1. 调整登出函数的判断逻辑:
suspend fun logout(token: String): NetworkResult<Unit> {
      return try{
          val logoutResponse = service.logout("Token $token")
          if (logoutResponse.isSuccessful) {
              NetworkResult.Success(Unit)
          } else {
              NetworkResult.Error(null)
          }
      }catch(e:Throwable){
          NetworkResult.Error(null)
      }
}

方案2:自定义支持空响应的转换器

如果项目中存在大量返回204的接口,可以自定义ConverterFactory,当返回类型为Unit且响应码为204时直接返回Unit,不需要解析响应体,就不需要每个接口都修改为Response类型。

方案3:使用空响应适配库

部分第三方Retrofit扩展库已经内置了204空响应的适配逻辑,引入对应依赖后即可自动处理该场景。

内容的提问来源于stack exchange,提问作者abdullah celik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 13:36:11