Retrofit에 대해 Naver API 사용
- archive
- 2019. 12. 27. 17:35
Retrofit
Retrofit은 Square사에서 제공하는 오픈 소스 라이브러리 입니다. REST API통신을 위한 라이브러리 입니다. 이번 포스팅에서는 Retrofit을 사용하는 방법에 대해 알아 보겠습니다.
Retrofit Dependencies 추가 및 ConverterFactory Dependencis 추가
Module단의 gradle 파일에 아래와 같이 dependencies를 추가 해 줍니다. Converter로 Gson도 많이 이용하나 이번 프로젝트에서는 moshi라는 라이브러리를 사용했습니다.
implementation "com.squareup.retrofit2:retrofit:2.5.0"
implementation "com.squareup.retrofit2:converter-moshi:1.8.0"
Retrofit Build 하기 (MovieService.kt)
Retrofit을 사용하기 위해 Builder를 사용하여 retrfoit 설정과 객체생성 하는 방법에 대해 알아 보겠습니다.
- baseURL() - 어떤 서버로 네트워크 통신을 요청할 것 인지
- addContverterFactory() - 통신이 완료된 후, 어떤 converter를 이용하여 데이터를 파싱할 것인지
- build() - Retrofit.Builder 객체에 설정한 정보를 이용하여 실질적으로 Retrofit 객체를 만들어 줌.
private const val BASE_URL = "https://openapi.naver.com/v1/"
private val retrofit = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.build()
Interface 정의 하기 (MovieService.kt)
해당 단계에서는 API 규격에 맞는 Interface들을 선언해야 합니다.
- @GET - HTTP 통신에 사용되는 METHOD중 GET 요청을 하겠다라고 명시하는 Annotation
- @Path는 URL의 부분 중 일부 경로가 필요에 따라 동적으로 바인딩 되어야 하는 경우 지정한다. {type} 부분에서 동적으로 바인딩 된다.
- @Header들을 파라미터로 받아 지정
- @Query 또한 파라미터로 받아 지정
interface MovieService {
@GET("search/{type}")
fun getMovies(
@Header("X-Naver-Client-Id") clientId: String,
@Header("X-Naver-Client-Secret") clientPw: String,
@Path("type") type: String,
@Query("query") query: String
): Call<Movie>
}
Interface 객체 생성 (MovieService.kt)
Retrofit의 create()와 위에서 정의한 interface를 사용하여 실질적으로 사용할 retrofit 클라이언트 객체를 생성합니다.
object MovieApi {
val retrofitService: MovieService by lazy {
retrofit.create(MovieService::class.java)
}
}
Http요청을 보내고자 한다면 이 객체의 getMovies()를 호출 해 주면 됩니다. enqueue()를 이용하여 비동기 처리를 합니다.
fun getMovieList(query : String) {
MovieApi.retrofitService.getMovies(CLIENT_ID, CLIENT_SECRET, "movie", query).enqueue(
object : retrofit2.Callback<Movie> {
override fun onResponse(call: Call<Movie>, response: Response<Movie>) {
size.value = response.body()?.items?.size
items.value = response.body()?.items
}
override fun onFailure(call: Call<Movie>, t: Throwable) {
Log.d("MovieFragment", "onFailure() message : " + t.message)
}
}
)
}
'archive' 카테고리의 다른 글
[Python]SQLite DB (0) | 2020.01.04 |
---|---|
[Python]Print() (0) | 2019.12.31 |
ViewModel과 Databinding 그리고 Recyclerview (1) | 2019.12.27 |
안드로이드 DataBinding, MVVM 구구단 (0) | 2019.12.12 |
파이썬 #1) VSCODE에서 에서 파이썬 개발하기 (0) | 2019.12.06 |