自定义 RetrofitConverter 实现 BaseResponse 自动检查有效性

361 阅读1分钟

参考和灵感来自于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 判定有效性