登出接口返回204 No Content时Retrofit触发异常该如何处理?
问题原因
- Retrofit默认的响应转换器(如GsonConverter、kotlinx序列化转换器)会尝试将服务端返回的响应体解析为接口声明的返回类型。当服务端返回204 No Content时响应体为空,转换器无法从空数据流中解析出对应类型的对象,就会抛出解析异常,哪怕请求本身已经执行成功。
- 你当前的接口方法没有显式声明返回类型为
Response类,Retrofit会自动触发响应体解析逻辑,因此204响应会直接触发catch分支。
解决方案
方案1:修改接口返回类型为Response<Unit>(最推荐)
显式声明返回Response<Unit>后,Retrofit不会自动解析响应体,你可以自行判断响应状态码,所有2xx范围内的状态码都会被判定为请求成功,完美适配204无内容的场景。
- 修改API接口定义:
@POST("logout") suspend fun logout(@Header("Authorization") token: String): Response<Unit>
- 调整登出函数的判断逻辑:
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
相关产品推荐
相关产品推荐

