728x90
Android Studio 4.2.2
Android SDK 28
Kotlin 1.5.21
도입
HTTP 통신을 할 때, 유효한 사용자임을 증명하는 정보를 헤더에 넣어 요청해야 하는 경우가 많다.
예를 들어 로그인을 했다면 유저정보가 담긴 토큰을 헤더에 넣어 로그인한 유저라는 정보를 보내는 것이다.
이 동작은 레트로핏 객체를 생성할 때 자동으로 헤더에 토큰 정보를 넣는 OkHttp클라이언트를 추가하면 된다.
XAccessTokenInterceptor
shared preference에 X-ACCESS-TOKEN이란 키값으로 저장되어있는 토큰을 헤더에 추가하는 Interceptor 클래스
class XAccessTokenInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val builder = chain.request().newBuilder()
val jwtToken: String? =
App.sSharedPreferences.getString(App.X_ACCESS_TOKEN, null)
if (jwtToken != null) {
builder.addHeader(App.X_ACCESS_TOKEN, jwtToken)
}
return chain.proceed(builder.build())
}
}
shared preference 객체인 sSharedPreferences는 Application 클래스를 상속받는 App 클래스에서 초기화한 상태이다.
class App : Application() {
companion object { // 자바에서 static 처럼 사용할 수 있는 변수 및 함수
// SharedPreferences 관련 문자열
val SP_TAG = "LINKAIVE_APP"
val X_ACCESS_TOKEN = "X-ACCESS-TOKEN"
// SharedPreferences 객체
lateinit var sSharedPreferences: SharedPreferences
}
override fun onCreate() {
super.onCreate()
// sp 객체 초기화
sSharedPreferences = applicationContext.getSharedPreferences(SP_TAG, Context.MODE_PRIVATE)
}
}
OkHttpClient 및 Retrofit 객체 생성
OkHttpClient 객체를 만들 때 addNetworkInterceptor() 메소드를 사용해 Interceptor 객체를 세팅한다.
Retrofit 객체를 만들 때에는 client() 메소드로 OkHttpClient 객체를 세팅한다.
class App : Application() {
companion object { // 자바에서 static 처럼 사용할 수 있는 변수 및 함수
...
// Retrofit 인스턴스
lateinit var retrofit: Retrofit
var gson = GsonBuilder().setLenient().create()
@JvmName("getRetrofit1")
fun getRetrofit(): Retrofit {
if (!this::retrofit.isInitialized) {
val client = OkHttpClient.Builder()
.readTimeout(50000, TimeUnit.MILLISECONDS) // 5000
.connectTimeout(50000, TimeUnit.MILLISECONDS) // 5000
.addNetworkInterceptor(XAccessTokenInterceptor()) // JWT 자동 헤더 전송
.build()
retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
}
return retrofit
}
}
...
}
728x90
'Android' 카테고리의 다른 글
[Android] RecyclerView CRUD (0) | 2022.10.22 |
---|---|
[Android] RecyclerView 사용법 (0) | 2022.10.22 |
[Android] 레트로핏(Retrofit2) 사용법 (0) | 2021.11.21 |
[Android] 직접 만든 안드로이드 프로젝트 템플릿 (0) | 2021.11.18 |
[Android] 권한 확인 및 요청 (0) | 2021.11.15 |