관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 코틀린 Retrofit2 OkHttP interceptor 헤더 사용법 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] 코틀린 Retrofit2 OkHttP interceptor 헤더 사용법

막무가내막내 2020. 3. 7. 19:05
728x90

 

[2021-06-05 업데이트]

 

https://blog.codavel.com/how-to-create-an-http-interceptor-for-an-android-app-using-okhttp3

 

 

안드로이드(클라이언트)와 서버 간에 Retrofit2를 사용하여 통신을 하는데 

안드로이드 클라이언트단 쪽에서 인터셉터를 추가로 사용하면 안드로이드에서 서버에게 데이터 전송 및 수신받을때 인터셉터 말 그대로 중간에 매개체가 되어 어떠한 처리를 해줄 수 있다. 

 

그 중 헤더에 값을 담아주는 역할이 있다.

이를 활용하여 쿠키/세션을 유지하는 방법이 있는데 이는 밑 박상권 개발자님의 블로그를 참고하면 된다.

gun0912.tistory.com/50

 

[안드로이드/Android]Retrofit에서 Interceptor를 이용해 쿠키/세션 유지하는 방법

Retrofit은 우리가 해주어야할 귀찮은 네트워크 통신 작업을 대신해주는 정말 유용한 라이브러리입니다. [안드로이드]유용한 라이브러리 - Retrofit(REST API 통신) REST API통신을 할때 정말 유용하고 편

gun0912.tistory.com

 

안드로이드 코틀린에서 레트로핏에 인터셉터의 다양한 기능 중 헤더만 덧붙이는 코드입니다.

package com.mtjin.androidarchitecturestudy.api

import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.io.IOException

object ApiClient {
    private const val BASE_URL = "https://openapi.naver.com/"
    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("X-Naver-Client-Id", "33chRuAiqlSn5hn8tIme")
                .addHeader("X-Naver-Client-Secret", "fyfwt9PCUN")
                .build()

            proceed(newRequest)
        }
    }
}

 

 

추후 애플리케이션 단 말고 네트워크 로깅도 사용하게 되면 추가할 예정입니다.

[추가 완료] 

로깅과 헤더를 두개 추가한 예제입니다.

interface MainApiInterface {

    @GET("datas/compare/region")
    fun requestCompareRegion(): Single<EnvRes>

    @GET("datas/compare/same-region")
    fun requestCompareSameRegion(
        @Query("usage") usage: Int = 80000
    ): Single<EnvRes>

    @GET("datas/compare/industry-all")
    fun requestCompareIndustryAllEnv(): Single<EnvRes>

    @GET("datas/compare/industry-sameall")
    fun requestCompareIndustrySameAll(@Query("usage") usage: Int): Single<EnvRes>

    @GET("datas/detail/industry-energy")
    fun requestDetailIndustryEnergy(
        @Query("gas") gas: Int,
        @Query("other") other: Int,
        @Query("oil") oil: Int,
        @Query("coal") coal: Int,
        @Query("thermal") thermal: Int,
        @Query("electric") electric: Int
    ): Single<IndustryEnergyRes>

    companion object {
        private const val BASE_URL =
            "http://ff4839aab5bb.ngrok.io"

        fun create(): MainApiInterface {
            val logger = HttpLoggingInterceptor().apply {
                level =
                    HttpLoggingInterceptor.Level.BASIC
            }
            val interceptor = Interceptor { chain ->
                with(chain) {
                    val newRequest = request().newBuilder()
                        .addHeader("Authorization", "Token " + UserInfo.headerKey)
                        .build()
                    proceed(newRequest)
                }
            }
            Log.d("AAAAA", "Token " + UserInfo.headerKey)
            val client = OkHttpClient.Builder()
                .addInterceptor(logger)
                .addInterceptor(interceptor)
                .build()

            return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(MainApiInterface::class.java)
        }
    }
}
728x90
Comments