728x90
Api 통신 중, Error Status로 반환되는 경우에는 Result Body를 일반적인 response body로 가져올 수 없다.
resonse의 errorBody()를 활용해야 Error Result Body를 가져올 수 있다.
{
"code": "INVALID_AUTH_TOKEN",
"message": "invalid token"
}
먼저 다음과 같은 data class를 준비한다.
data class NormalErrorResponse(
val code: String?,
val message: String?
)
제네릭을 활용하여 Error Response를 data class로 변환해 주는 함수를 구현했다.
inline을 통해 해당 성능 손실을 줄이고, <reified T>를 통해 런타임 시에도 타입 정보를 유지하도록 했다.
TypeToken에서 gson으로 타입 변환 시, 실패하면 null을 반환하도록 했다.
inline fun <reified T> ResponseBody.parse(): T? {
val gson = Gson()
val type = object : TypeToken<T>() {}.type
return gson.fromJson(charStream(), type)
}
return if (response.isSuccessful) {
ApiTaskResult(true)
} else {
val errResponse: NormalErrorResponse? = response.errorBody()?.parse<NormalErrorResponse>()
ApiTaskResult(false, errResponse?.message)
}
이제 위와 같이 활용하여 필요한 형식의 data class만 지정해주면 Error Response 변환이 용이해진다.
728x90