Developer Geek

Retrofit + Interceptor 예제 in Kotlin 본문

안드로이드/Network

Retrofit + Interceptor 예제 in Kotlin

devGeek 2022. 6. 9. 09:00
반응형

인터셉터란
Retrofit Singletone Pattern
Singleton Pattern

build.gradle(:app): Retrofit 사용을 위한 Dependency 추가, GsonConverter 추가 

dependencies {
    ..
	
    // https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit
    implementation("com.squareup.retrofit2:retrofit:2.9.0")

    // gson converter
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    
    ..
}

 

 

Request Interceptor For Adding Headers

RetrofitClient.kt

object RetrofitClient {
    private const val BASE_URL = "https://run.mocky.io"

    val interceptorClient = OkHttpClient().newBuilder()
        .addInterceptor(RequestInterceptor())
        .build()

    val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(interceptorClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

}

class RequestInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val builder = chain.request().newBuilder()
        var auth = "" // get from localStorage

        builder.addHeader("Auth", auth)
        builder.addHeader("User-Agent", "Dev-Geek-Sample-App")

        return chain.proceed(builder.build())
    }
}

RetforitClient는 Singleton Pattern을 사용했다.

RequestInterceptor 구현

  1. 먼저 chain.request()로 부터 request를 받아 newBuilder()를 통해 builder를 생성한다.
  2. 다음 local storage에서 header에 담을 auth값을 읽어온다.
  3. builderaddHeader(K, V) 메서드를 이용하여 헤더 정보를 담는다.
  4. chain.proceed()에 파라미터로 builder를 담아 요청보낸다.

Add Interceptor

먼저 앞서 구현한 RequestInterceptor를 포함하는 OkHttpClient Builder를 생성한다. (interceptorClient)
다음으로 retrofit을 생성할 때, client() 메서드를 통해 인자에 생성한 interceptorClient를 넣어 생성한다.

Response Interceptor For Control Error

RetrofitClient.kt

object RetrofitClient {
    private const val BASE_URL = "https://run.mocky.io"

    val interceptorClient = OkHttpClient().newBuilder()
        .addInterceptor(ResponseInterceptor())
        .build()

    val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(interceptorClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

}

class ResponseInterceptor : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val response = chain.proceed(request)

        when (response.code()) {
            400 -> {
                // todo Control Error
            }
            401 -> {
                // todo Control Error
            }
            402 -> {
                // todo Control Error
            }
        }
        return response
    }
}

RetforitClient는 Singleton Pattern을 사용했다.

ResponseInterceptor 구현

  1. 먼저 request에 해당하는 response를 생성 하기 위해, chain.request()를 통해 request를 생성한다.
  2. 생성한 request를 이용하여 chain.proceed(request) request를 숭행한 결과의 response를 생성한다.
  3. 마지막으로 response.code에 따라 에러를 처리해준다.

Add Interceptor

먼저 앞서 구현한 ResponseInterceptor를 포함하는 OkHttpClient Builder를 생성한다. (interceptorClient)
다음으로 retrofit을 생성할 때, client() 메서드를 통해 인자에 생성한 interceptorClient를 넣어 생성한다.

Request Interceptor For Adding Headers & Response Interceptor For Control Error

RetrofitClient.kt

아래의 예제 코드는 InterceptorHeader에 데이터를 담는 것과 Response를 통해 에러 처리까지 모두 하는 Interceptor이다.

import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitClient {
    private const val BASE_URL = "https://run.mocky.io"

    val interceptorClient = OkHttpClient().newBuilder().addInterceptor(RequestInterceptor())
        .addInterceptor(ResponseInterceptor()).build()

    val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(interceptorClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

}

class RequestInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        var auth = "" // get from localStorage

        builder.addHeader("Auth", auth)
        builder.addHeader("User-Agent", "Dev-Geek-Sample-App")

        return chain.proceed(builder.build())
    }
}

class ResponseInterceptor : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val response = chain.proceed(request)

        when (response.code()) {
            400 -> {
                // todo Control Error
            }
            401 -> {
                // todo Control Error
            }
            402 -> {
                // todo Control Error
            }
        }
        return response
    }
}

질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
zero5.two4@gmail.com

반응형

'안드로이드 > Network' 카테고리의 다른 글

OkHttp Interceptor in Android Kotlin  (2) 2022.06.08
Android Retrofit Singleton Example in Kotlin  (0) 2022.06.02
Retrofit2 in Kotlin  (0) 2022.05.30
Retrofit2 in Java  (0) 2022.05.29
안드로이드 인터넷 접근 권한 허용  (0) 2022.05.05
Comments