잘못된 API 응답에서 isSuccess() 파헤치기

5242 단어
나쁜 디자인 api보다 답답한게 없는데 그런 api가 있다면?

{
status : "Success",
message : "",
x : {},
y:10
}


x 위의 샘플은 api에서 다른 것으로 변경될 수 있고 언젠가는 옆에 다른 키가 있습니다.
제가 말하고 싶은 것은 모든 응답에는 상태와 메시지가 있지만 그와 함께 무엇을 가지고 있는지 모릅니다. 여기서 해야 할 일은 응답이 성공했는지 실패했는지를 아는 것입니다.
개체에 대한 각 응답을 역직렬화한 다음 확인할 수 있습니다.
xResponse.success = "Success"
각 유형에 대해 나쁘고 매번 그렇게하고 싶지 않습니다.
원해요
xResposne.isSuccess()
두 가지 해결책이 있습니다.
첫 번째는 기본 클래스이며 모든 응답 클래스를 확장합니다.

open class BaseResponse {
    @SerializedName("Status")
    val status: String = "Failures"
    @SerializedName("Message")
    val message: String = ""
}
fun BaseResponse.isSuccessful(): Boolean {
    if (status == "Success") {
        return true
    }
    return false
}


그리고

data class ArticlesResponse(
    @SerializedName("news")
    val news: ArrayList<New>,
    @SerializedName("pageCount")
    val pageCount: Int,
):BaseResponse()


나는 모든 새로운 응답 클래스가 이 기본 응답을 확장해야 하기 때문에 이 솔루션이 마음에 들지 않습니다.
솔루션 2번은 리플렉션입니다. 모든 응답 클래스에는 상태 속성이 있다는 것을 알고 있기 때문에 해당 지식을 사용하여 리플렉션을 수행하는 메서드를 만들 수 있습니다.
리플렉션 라이브러리를 추가하는 것을 잊지 마세요implementation "org.jetbrains.kotlin:kotlin-reflect:1.6.21"그럼 실제 작업

fun Any.isSuccess(): Boolean {
    val clazz = this.javaClass.kotlin
    clazz.memberProperties.forEach {
        if (it.name == "status") {
            val status = it.get(this)
            return status == "Success"
        }
    }
    return false
}


이것이 바로 이 솔루션의 문제점은 모든 클래스에서 isSuccess() 확장 메서드를 얻는다는 것입니다.

좋은 웹페이지 즐겨찾기