参考和灵感来自于Retrofit 妙用,拒绝重复代码
fun baseResponseWrapRetrofitConverterFactory(): Converter.Factory {
return object : Converter.Factory() {
override fun responseBodyConverter(
type: Type,
annotations: Array<out Annotation>,
retrofit: Retrofit
): Converter<ResponseBody, *> {
return Converter {
val wrapTypeToken = TypeToken.getParameterized(
BaseResponse::class.java,
type
)
val baseResponse = retrofit.nextResponseBodyConverter<Any>(
this,
wrapTypeToken.type,
annotations
).convert(it)
if (baseResponse is BaseResponse<*>) {
if (baseResponse.errorCode == 0) {
baseResponse.data
} else {
val errorCode = baseResponse.errorCode
val errorMsg = baseResponse.errorMsg
throw IOException("errorCode = $errorCode, errorMsg = $errorMsg")
}
} else {
baseResponse
}
}
}
}
}
给真实响应类型插值包装一层 BaseResponse 后,使用后继 Converter 进行类型解析,根据 errorCode 判定有效性