Android

[Android/Kotlin] retrofit2 헤더 추가하기

jhkimmm 2022. 1. 5. 09:40

안드로이드에서 API 요청을 보낼때는 주로 retrofit2 라이브러리를 사용합니다.

토큰과 같은 정보들은 Request의 헤더에 포함되어서 서버로 전달되어야 하므로 헤더를 추가하는 방법을 알아보겠습니다.

헤더를 추가하는 방법에는 두가지가 있는데, 하나는 API 인터페이스에 직접 @Header 어노테이션을 붙인 파라미터를 추가하는 방법이고 다른 하나는 Interceptor를 사용하는 방법입니다.

@Header 어노테이션 활용

import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Query

interface ItemListAPI {
    @GET("/api/itemlist")
    fun getItemList(
        @Header("token") token: String?,
        @Query("wid") wid : Int
    ): Call<List<ItemListResponseData>>
}

다른 파라미터를 넘기는 것과 비슷한 방식으로 @Header 어노테이션만 붙여주면 되는 가장 간단한 방법입니다.

Interceptor 활용

토큰과 같은 인증정보처럼 모든 요청의 헤더에 포함되어 있어야하는 정보들은 @Header 어노테이션으로 모든 API에 일일이 토큰 헤더를 붙이는 것은 코드의 중복도 심하고 관리하기도 번거롭습니다.

okhttp3의 Interceptor를 활용하면 따로 헤더를 직접 추가해주지 않아도 모든 Request에 자동으로 헤더를 추가한 다음 요청을 보냅니다.

object ApiClient {
    private const val BASE_URL = "(your url)"
    fun getApiClient(): Retrofit {
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(provideOkHttpClient(AppInterceptor()))
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    private fun provideOkHttpClient(interceptor: AppInterceptor): OkHttpClient
        = OkHttpClient.Builder().run {
            addInterceptor(interceptor)
            build()
        }

    class AppInterceptor : Interceptor {
        @Throws(IOException::class)
        override fun intercept(chain: Interceptor.Chain) : Response = with(chain) {
            val newRequest = request().newBuilder()
                .addHeader("(header Key)", "(header Value)")
                .build()
            proceed(newRequest)
        }
    }
}

모든 액티비티에서 공용으로 사용할 ApiClient라는 object를 만든 다음 AppInterceptor를 추가 해주었습니다.

.addHeader("(header Key)", "(header Value)") 에 지정된 헤더정보가 모든 요청에 자동적으로 추가됩니다.

private val api = ApiClient.getApiClient().create(ItemListAPI::class.java)

 원하는 액티비티나 프래그먼트에서 위와 같이 Retrofit인스턴스를 가져와서 사용할 수 있습니다.