일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- scope function
- Kotlin FCM
- OkHttp Interceptor
- MVP Architecture
- 안드로이드 갤러리 접근
- Android
- Java
- Android Interceptor
- 안드로이드 카카오 로그인
- Android Jetpack
- Android WebView
- 습관만들기
- 프로그래머스 알고리즘
- Android 12
- DataBinding
- 안드로이드 fcm
- Android 12 대응
- Android ProgressBar
- 영어독립365
- 카카오 알고리즘
- Kotlin
- Android ViewPager2
- 알고리즘 자바
- Android DataBinding
- android recyclerview
- WebView
- 영어공부
- Android Navigation
- 안드로이드
- 66챌린지
- Today
- Total
Developer Geek
OkHttp Interceptor in Android Kotlin 본문
개요
Interceptors
란 API 통신에서 요청에 대해 monitor
, rewrite
그리고 retry
할 수 있는 강력한 메커니즘이다. Interceptor를 통해서 우리는 API 통신을 만들 때, 통신 과정을 모니터링 하거나 특별한 작업을 수행할 수 있다. 쉽게 말해서, Interceptor 기능은 공항 보안 요원이 보안 검사하는 과정과 비슷하다. 그들은 먼저 탑승권을 확인하고, 승인한 다음에서야 우리가 지나갈 수 있도록 하는 것처럼 말이다.
Interceptor
는 중앙에서 API 호출들을 모니터링 하는 것처럼 다양하게 사용된다. 일반적으로 우리는 각각의 network 호출에 대해 logger
를 달아야 할 필요가 있다. 하지만 Interceptor를 이용한다면 하나의 logger
를 추가하여 모든 network 호출에 대해 동작하도록 할 수 있다. 다른 경우로는 offline-first app
의 build를 위해 network 요청의 response
를 캐싱하기도 한다.
Interceptor 종류
Interceptors
에는 2가지 타입이 있다.
- Application Interceptors:
Application Code(우리가 작성한 코드)
와OkHttp Core Library
사이에 추가된Interceptors
.
- 이런 Interceptor들은
addInterceptor()
를 이용한다.
- Network Interceptor:
OkHttp Core Library
와server
사이에 추가된Interceptors
- 이런 Interceptor들은
addNetworkInterceptor()
를 이용한다.
OkHttpClient에 interceptors 추가하기
fun devgeekHttpClient(): OkHttpClient {
val bulder = OkHttpClient().newBuilder()
.addInterceptor(/*my interceptor*/)
return builder.build()
}
위에 코드를 보면 addInterceptor
에 내가 만든 Interceptor를 추가할 수 있는데, 이론적인 것보다는 실제로 어떻게 Android 개발에서 Interceptor가 사용되는지 살펴보도록 하자.
Error-Interceptor
class devgeekInterceptor: Interceptor{
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val response = chain.proceed(request)
when (response.code()) {
400 -> {
// Show Bad Request Error Message
}
401 -> {
// Show UnauthorizedError Message
}
403 -> {
// Show Forbidden Message
}
404 ->{
// Show NotFound Message
}
// ... and so on
}
return response
}
}
- 먼저,
chain.request()
로부터request
를 받는다. chain.proceed()
에request
를 담아 보내, 서버로 부터 온response
를 저장한다.proceed(request)
여기서,response code
를 확인하고 원하는 동작을 수행한다.
예를 들어 401 Error(Unauthroized)
를 받는다면, 로그아웃과 같은 동작을 수행하면 된다.
Adding a Header, such as an Access Token, in a central location
만약 API 통신을 구현해야 하는데 모든 API 통신에 Authorization Header를 포함해야 한다면, 각각의 API에 넣어줄 수도 있고 Interceptor를 이용할 수 있다.
class UserAuth: Interceptor{
override fun intercept(chain: Interceptor.Chain): Response {
val requestBuilder = chain.request().newBuilder()
var auth = "" // get from localStorage
requestBuilder.addHeader("Auth", auth)
requestBuilder.addHeader("User-Agent", "Plz-Sample-App")
return chain.proceed(requestBuilder.build())
}
}
- 먼저
chain.request()
로 부터request
를 받아.newBuilder()
requestBuilder
를 생성한다. - 다음
local storage
에서header token
을 읽어온다. requestBuilder
에addHeader(K, V)
를 이용하여 헤더 정보를 담는다.chain.proceed()
에requestBuilder
를 담아 요청보낸다.
참고 자료
질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
zero5.two4@gmail.com
'안드로이드 > Network' 카테고리의 다른 글
Retrofit + Interceptor 예제 in Kotlin (0) | 2022.06.09 |
---|---|
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 |