안드로이드/Network
Retrofit + Interceptor 예제 in Kotlin
devGeek
2022. 6. 9. 09:00
반응형
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 구현
- 먼저
chain.request()
로 부터request
를 받아newBuilder()
를 통해builder
를 생성한다. - 다음 local storage에서 header에 담을
auth
값을 읽어온다. builder
에addHeader(K, V)
메서드를 이용하여 헤더 정보를 담는다.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 구현
- 먼저 request에 해당하는 response를 생성 하기 위해,
chain.request()
를 통해request
를 생성한다. - 생성한
request
를 이용하여chain.proceed(request)
request를 숭행한 결과의response
를 생성한다. - 마지막으로
response.code
에 따라 에러를 처리해준다.
Add Interceptor
먼저 앞서 구현한 ResponseInterceptor
를 포함하는 OkHttpClient Builder
를 생성한다. (interceptorClient
)
다음으로 retrofit
을 생성할 때, client()
메서드를 통해 인자에 생성한 interceptorClient
를 넣어 생성한다.
Request Interceptor For Adding Headers & Response Interceptor For Control Error
RetrofitClient.kt
아래의 예제 코드는 Interceptor
에 Header
에 데이터를 담는 것과 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
반응형