버튼 수집상

[안드로이드] Retrofit 대신 Ktor로 Api 호출해보기 - 2 본문

TIL - 안드로이드

[안드로이드] Retrofit 대신 Ktor로 Api 호출해보기 - 2

cocokaribou 2023. 12. 11. 17:08

이전 글

 

[안드로이드] Retrofit 대신 Ktor로 Api 호출해보기 - 1

배경 KMM (Kotlin Multiplatform Mobile) 이 여기저기서 많이 언급되고 있다. 줄곧 XML을 쓰다가 마침 Compose 프로젝트를 할 기회가 생겼다. 이 기회에 Ktor도 써보면 어떨까 생각이 들어서 간단하게 써보았다

collectingbuttons.tistory.com

 

기존에 썼던 OkHttpClient.Builder 설정대로 Ktor HttpClient를 설정해보겠다.

 

요구사항

- 상용 api 호출

- response / request 로그

- Flipper 연동 -> OkHttpClient만 지원하는듯

- Flow 리턴

- connect / write / read 타임아웃

- 헤더 cookie 설정

- 헤더 userAgent 설정

- X509TrustManager (debug 모드에서 ssl 인증오류 무시)

 

Ktor Client의 response serialization을 검색했을 때 제일 자주 나오는 JsonFeature는 2.0.0부터 deprecated 됐다.

 

HttpClient 생성할 때 옵션 설정 가능.

val client = HttpClient(Android) {
    expectSuccess = true

    defaultRequest {
        // base url
        url(HttpRoutes.BASE_URL)

        // header
        header(HttpHeaders.ContentType, Json)
        header(HttpHeaders.Accept, Json)
        header(HttpHeaders.UserAgent, "test-user")
    }
    install(ContentNegotiation) {
        json(Json {
            prettyPrint = true
            isLenient = true
            ignoreUnknownKeys = true
        })
    }

    install(ResponseObserver) {
        onResponse { response ->
            Log.i("logger response", "${response.bodyAsText()}")
        }
    }

    install(HttpTimeout) {
        requestTimeoutMillis = 5000
        connectTimeoutMillis = 5000
        socketTimeoutMillis = 5000
    }

    install(HttpRequestRetry) {
        maxRetries = 3
        retryOnServerErrors()
    }

    engine {
        sslManager = { httpsURLConnection ->
            httpsURLConnection.sslSocketFactory = SslSettings.getSslContext()?.socketFactory
        }
    }
}.apply {
    // interceptor
    plugin(HttpSend).intercept { request ->
        val flipperInterceptor = AndroidFlipperClient.getInstance(BaseApplication.context).getPluginByClass(NetworkFlipperPlugin::class.java)
            ?.let {
                FlipperOkhttpInterceptor(it)
            }
        execute(request)
    }
}
728x90