1 서론
인터셉터란 작업의 요청을 가로챈후 특정 작업을 하기위한 용도로 사용되는 역활을 수행한다.
예로 요청을 수행할때 로그를 출력한다거나
요청을 할때 반드시 필요한 선행작업이있다면 인터셉터를 사용하여 처리하는경우가있다.
이 글에서는 로깅 작업과 필수파라미터 를 인터셉터로 처리해볼것이다.
2 준비 작업
2.1 의존성 추가
implementation 'com.squareup.okhttp3:logging-interceptor:4.8.1'
2.3 Retrofit Client 준비
object RetrofitClient {
private var retrofitClient: Retrofit?=null
fun getClient(baseUrl:String):Retrofit?{
if(retrofitClient == null){
retrofitClient = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
return retrofitClient
}
}
위와같이 베이직한 RetrofitClient 가있을때 이곳에 인터셉터를 구현할것이다.
3 로깅 인터셉션
Retrofit 를 활용하여 API 통신을 할때
네트워크의 흐름을 파악하기위한 로깅 을 인터셉터를 활용하여 출력할것이다.
3.1 Extension 만들기
fun String?.isJsonObject():Boolean{
return this?.startsWith("{") ==true && this.endsWith("}")
}
fun String?.isJsonArray():Boolean{
return this?.startsWith("[") ==true && this.endsWith("]")
}
이 코드는 response 데이터가 JSON 의 형태인지 JSON Array 의 형태인지 파악하기위해 작성하였다.
반드시 필요한것은 아니다.
3.2 Retrofit Client 에 인터셉터 추가
fun getClient(baseUrl:String):Retrofit?{
val client = OkHttpClient.Builder()
val loggingInterceptor = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
when {
message.isJsonObject() ->
Log.d(TAG, JSONObject(message).toString(4))
message.isJsonArray() ->
Log.d(TAG, JSONObject(message).toString(4))
else -> {
try {
Log.d(TAG, JSONObject(message).toString(4))
} catch (e: Exception) {
Log.d(TAG, message)
}
}
}
}
})
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
client.addInterceptor(loggingInterceptor)
if(retrofitClient == null){
retrofitClient = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(client.build())
.build()
}
return retrofitClient
}
먼저 OkHttpClient 를 생성한다. 그후 HttpLoggingInterceptor 를 생성하여 Console 에 Log 를 남기도록한다.
loggingInterceptor 의 Level 을 설정하면 로깅 인터셉터 완성이다.
그렇게 만들어진 HttpLoggingInterceptor를 OkHttpClient 에 추가한후
OkHttpClient 를 RetrofitClient에 추가한다.
4 파리미터 인터셉션
API 요청시 변하는 데이터가 아닌 특수한 Key 값이나 JWT 와 같이
고정적으로 필요한 데이터가 있을수있다.
이때 인터셉터를 이용해서 직접 매번 넣어주는것이 아닌 자동으로 넣어줄것이다
4.1 object 만들기
object API{
const val BASE_URL :String ="https://api.test.com/"
const val KEY :String ="DFf5onmix37b0ChMS6AIzf1oHYc"
}
관리를 위해 따로 object로 Key 를 빼두었다.
4.2 Retrofit Client 에 인터셉터 추가
fun getClient(baseUrl:String):Retrofit?{
val client = OkHttpClient.Builder()
var baseParameterInterceptor : Interceptor = (object : Interceptor{
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val addedUrl = originalRequest.url.newBuilder().addQueryParameter("client_key", API.KEY).build()
val finalRequest = originalRequest.newBuilder()
.url(addedUrl)
.method(originalRequest.method,originalRequest.body)
.build()
return chain.proceed(finalRequest)
}
})
client.addInterceptor(baseParameterInterceptor)
if(retrofitClient == null){
retrofitClient = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(client.build())
.build()
}
return retrofitClient
}
먼저 기본 Request 객체를 chain 에서 얻어온후
newBuilder 을 통해 Parameter을 넣는 모습을 볼수있다.
여기서 모든 API 통신에 사용할 KEY 를 넣는다.
그후 나머지를 기본 Request 로 넣어준후 반환해주는것으로 인터셉터 구현이 끝이난다
이렇게 만들어진 인터셉터를 OkHttpClient 에 추가한후
OkHttpClient 를 RetrofitClient에 추가한다.
이렇게 하는것으로
원하는 데이터를 인터셉터를 사용하여 넣어줄수있었다.
'Android' 카테고리의 다른 글
Android ViewBinding으로 FindViewByid 랑 작별하기 (0) | 2021.09.25 |
---|---|
Android Coroutine 사용하기 (0) | 2021.09.25 |
Android Retrofit 사용하여 API 호출하기 (0) | 2021.09.25 |
Android Floation Widget 구현하기 (0) | 2021.09.25 |
Android 다크모드(Theme 사용) 적용하기 (0) | 2021.09.25 |