반응형
레트로핏 인터페이스
package com.example.unsplash_app_tutorial.retrofit
import com.example.unsplash_app_tutorial.utils.API
import com.google.gson.JsonElement
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Query
interface IRetrofit {
// https://www.unsplash.com/search/photos?query=""
@GET(API.SEARCH_PHOTOS)
fun searchPhotos(@Query("query") searchTerm: String) : Call<JsonElement>
@GET(API.SEARCH_USERS)
fun searchUsers(@Query("query") searchTerm: String) : Call<JsonElement>
}
RetrofitClient.kt
package com.example.unsplash_app_tutorial.retrofit
import android.util.Log
import com.example.unsplash_app_tutorial.utils.API
import com.example.unsplash_app_tutorial.utils.Constants.TAG
import com.example.unsplash_app_tutorial.utils.isJsonArray
import com.example.unsplash_app_tutorial.utils.isJsonObject
import com.google.gson.JsonObject
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
import okhttp3.logging.HttpLoggingInterceptor
import org.json.JSONObject
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.lang.Exception
// 싱글턴
object RetrofitClient {
// 레트로핏 클라이언트 선언
private var retrofitClient: Retrofit? = null
// 레트로핏 클라이언트 가져오기
fun getClient(baseUrl: String): Retrofit? {
Log.d(TAG, "RetrofitClient - getClient() called")
// okhttp 인스턴스 생성
val client = OkHttpClient.Builder()
// 로그를 찍기 위해 로깅 인터셉터 추가
val loggingInterceptor = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
// Log.d(TAG, "RetrofitClient - log() called / message: $message")
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)
// 위에서 설정한 로깅 인터셉터를 okhttp 클라이언트에 추가한다.
client.addInterceptor(loggingInterceptor)
// 기본 파라미터 인터셉터 설정
val baseParameterInterceptor: Interceptor = (object : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
Log.d(TAG, "RetrofitClient - intercept() called")
// 오리지널 리퀘스트
val originalRequest = chain.request()
// 쿼리 파라미터 추가하기
val addedUrl =
originalRequest.url.newBuilder().addQueryParameter("client_id", API.CLIENT_ID)
.build()
val finalRequest = originalRequest.newBuilder()
.url(addedUrl)
.method(originalRequest.method, originalRequest.body)
.build()
return chain.proceed(finalRequest)
}
})
// 위에서 설정한 기본 파라미터 인터셉터를 okhttp 클라이언트에 추가한다.
client.addInterceptor(baseParameterInterceptor)
// 레트로핏 빌더를 통해 인스턴스 생성
if (retrofitClient == null) {
retrofitClient = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
// 위에서 설정한 클라이언트로 레트로핏 클라이언트를 설정한다.
.client(client.build())
.build()
}
return retrofitClient
}
}
RetrofitManager
package com.example.unsplash_app_tutorial.retrofit
import android.util.Log
import com.example.unsplash_app_tutorial.utils.API
import com.example.unsplash_app_tutorial.utils.Constants.TAG
import com.example.unsplash_app_tutorial.utils.isJsonArray
import com.example.unsplash_app_tutorial.utils.isJsonObject
import com.google.gson.JsonObject
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
import okhttp3.logging.HttpLoggingInterceptor
import org.json.JSONObject
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.lang.Exception
import java.util.concurrent.TimeUnit
// 싱글턴
object RetrofitClient {
// 레트로핏 클라이언트 선언
private var retrofitClient: Retrofit? = null
// 레트로핏 클라이언트 가져오기
fun getClient(baseUrl: String): Retrofit? {
Log.d(TAG, "RetrofitClient - getClient() called")
// okhttp 인스턴스 생성
val client = OkHttpClient.Builder()
// 로그를 찍기 위해 로깅 인터셉터 추가
val loggingInterceptor = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
// Log.d(TAG, "RetrofitClient - log() called / message: $message")
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)
// 위에서 설정한 로깅 인터셉터를 okhttp 클라이언트에 추가한다.
client.addInterceptor(loggingInterceptor)
// 기본 파라미터 인터셉터 설정
val baseParameterInterceptor: Interceptor = (object : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
Log.d(TAG, "RetrofitClient - intercept() called")
// 오리지널 리퀘스트
val originalRequest = chain.request()
// 쿼리 파라미터 추가하기
val addedUrl =
originalRequest.url.newBuilder().addQueryParameter("client_id", API.CLIENT_ID)
.build()
val finalRequest = originalRequest.newBuilder()
.url(addedUrl)
.method(originalRequest.method, originalRequest.body)
.build()
return chain.proceed(finalRequest)
}
})
// 위에서 설정한 기본 파라미터 인터셉터를 okhttp 클라이언트에 추가한다.
client.addInterceptor(baseParameterInterceptor)
// 커넥션 타임 아웃
client.connectTimeout(10, TimeUnit.SECONDS)
client.readTimeout(10, TimeUnit.SECONDS)
client.writeTimeout(10, TimeUnit.SECONDS)
client.retryOnConnectionFailure(true)
// 레트로핏 빌더를 통해 인스턴스 생성
if (retrofitClient == null) {
retrofitClient = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
// 위에서 설정한 클라이언트로 레트로핏 클라이언트를 설정한다.
.client(client.build())
.build()
}
return retrofitClient
}
}
반응형
'Android' 카테고리의 다른 글
안드로이드 쓰레드와 핸들러 사용방법 (0) | 2022.10.22 |
---|---|
안드로이드 정리 (0) | 2022.10.20 |
[Kotlin] 매개변수가 존재하는 싱글턴 만들기 (0) | 2022.10.01 |
[Android] lottie를 활용하여 좋아요 클릭 버튼 만들기 (0) | 2022.10.01 |
안드로이드 레이아웃 종류 LinearLayout, RelativeLayout, ConstraintLayout (0) | 2022.10.01 |