안드로이드 토이 프로젝트#4 - Rtrofit2 적용
- 안드로이드
- 2019. 4. 8. 22:57
Retrofit2사용해서 http통신하기
Retrofit2사용해서 http통신하기
Retrofit2 란?
Square사에서 제공하는 오픈소스 라이브러리
Retrofit을 이용하기 위해서 필요한 것들
DataModel클래스
서버로 부터 JSON형식으로 통신하기 위해
Interface
HTTP 동작들을 정의해놓은 인터페이스
Retrofit.Builder 클래스
인터페이스를 사용하는 인스턴스
Builder는 Base URL을 설정
Square사에서 제공하는 오픈소스 라이브러리
Retrofit을 이용하기 위해서 필요한 것들
DataModel클래스
서버로 부터 JSON형식으로 통신하기 위해
Interface
HTTP 동작들을 정의해놓은 인터페이스
Retrofit.Builder 클래스
인터페이스를 사용하는 인스턴스
Builder는 Base URL을 설정
시작하기
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
Module 단 gradle에 위의 내용을 추가 해준다. Retrofit2와 okHttp3관련 라이브러리 들이다.
DataModel Class 만들기
네이버 개발자 센터에서 제공하는 Response 데이터 정보를 바탕를 바탕으로 DataClass를 만들어 보겠다. 네이버 개발자 센터에서는 아래와 같이 데이터를 제공하여 준다.
요청 변수 | 값 | 설명 |
---|---|---|
rss | - | 디버그를 쉽게 하고 RSS 리더기만으로 이용할 수 있게 하기 위해 만든 RSS 포맷의 컨테이너이며 그 외의 특별한 의미는 없다. |
channel | - | 검색 결과를 포함하는 컨테이너이다. 이 안에 있는 title, link, description 등의 항목은 참고용으로 무시해도 무방하다. |
lastBuildDate | datetime | 검색 결과를 생성한 시간이다. |
total | integer | 검색 결과 문서의 총 개수를 의미한다. |
start | integer | 검색 결과 문서 중, 문서의 시작점을 의미한다. |
display | integer | 검색된 검색 결과의 개수이다. |
item/items | - | XML 포멧에서는 item 태그로, JSON 포멧에서는 items 속성으로 표현된다. 개별 검색 결과이며 title, link, description을 포함한다. |
title | string | 검색 결과 문서의 제목을 나타낸다. 제목에서 검색어와 일치하는 부분은 태그로 감싸져 있다. |
link | string | 검색 결과 문서의 하이퍼텍스트 link를 나타낸다. |
image | string | 썸네일 이미지의 URL이다. 이미지가 있는 경우만 나타납난다. |
author | string | 저자 정보이다. |
price | integer | 정가 정보이다. 절판도서 등으로 가격이 없으면 나타나지 않는다. |
discount | integer | 할인 가격 정보이다. 절판도서 등으로 가격이 없으면 나타나지 않는다. |
publisher | string | 출판사 정보이다. |
isbn | integer | ISBN 넘버이다. |
description | string | 검색 결과 문서의 내용을 요약한 패시지 정보이다. 문서 전체의 내용은 link를 따라가면 읽을 수 있다. 패시지에서 검색어와 일치하는 부분은 태그로 감싸져 있다. |
pubdate | datetime | 출간일 정보이다. |
해당 정보들을 아래와 같이 클래스화 시켜 구현 하였다.
data class Book(
val lastBuildDate: String,
val total: Int,
val start: Int,
val display: Int,
val items: ArrayList<Item>
) {
data class Item (
val title: String,
val link: String,
val image: String,
val author: String,
val price: String,
val discount: String,
val publisher: String,
val isbn: String,
val description: String,
val pubdate: String
)
}
Interface 정의
interface RetrofitService {
@GET("v1/search/book.json")
fun getBookList(
@Header("X-Naver-Client-Id") clientId: String,
@Header("X-Naver-Client-Secret") clientPw: String,
@Query("query") query: String
): Call<Book>
}
Call<Book>을 리턴하는 함수 getBookList() 생성
어노테이션에 의한 파라미터를 지정할 수 있다
Get / post
Header
Query
이외에 Path, Body등이 있다.
@GET("v1/search/book.json")
fun getBookList(
@Header("X-Naver-Client-Id") clientId: String,
@Header("X-Naver-Client-Secret") clientPw: String,
@Query("query") query: String
): Call<Book>
}
Call<Book>을 리턴하는 함수 getBookList() 생성
어노테이션에 의한 파라미터를 지정할 수 있다
Get / post
Header
Query
이외에 Path, Body등이 있다.
Retrofit Builder class
class NetRetrofit {
fun createService(): RetrofitService {
val baseUrl = BASE_URL
val httpLoggingInterceptor = HttpLoggingInterceptor()
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
val okHttpClient : OkHttpClient? = OkHttpClient().newBuilder()
.addInterceptor(httpLoggingInterceptor)
.build()
val retrofit = Retrofit.Builder()
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(baseUrl)
.build()
return retrofit.create(RetrofitService::class.java)
}
}
fun createService(): RetrofitService {
val baseUrl = BASE_URL
val httpLoggingInterceptor = HttpLoggingInterceptor()
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
val okHttpClient : OkHttpClient? = OkHttpClient().newBuilder()
.addInterceptor(httpLoggingInterceptor)
.build()
val retrofit = Retrofit.Builder()
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(baseUrl)
.build()
return retrofit.create(RetrofitService::class.java)
}
}
Retrofit으로 Http 통신하기
아래 함수로 위에서 구현한 retrofit을 이용하여 http통신을 할 수 있다.
fun getBookList(q : String) {
netRetrofit.getBookList(CLIENT_ID, CLIENT_SECRET, q).enqueue(object : Callback<Book> {
override fun onResponse(call: retrofit2.Call<Book>, response: Response<Book>) {
if (response.isSuccessful) {
response.body()?.let {
mainAdapter.setBookList(it.items)
mainAdapter.notifyDataSetChanged()
}
}
}
override fun onFailure(call: retrofit2.Call<Book>, t: Throwable) {
Log.d("getBookList()", "onFailure() called. ${t.message}")
}
})
}
enqueue()
비동기로 Request를 보내고 Response가 돌아 왔을 때 콜백으로 앱에게 알려준다.
아래 두개의 메소드를 구현 해야 한다.
onResponse()
Http response를 받는다.
서버가 오류메시지를 리턴하는 경우 404또는 500일때도 호출. isSuccessful()로 성공적으로 reponse되었는지 확인 가능함
onFailure()
서버와 통신하는 중 네트워크 예외가 발생하거나 예기치 않은 예외 발생했을 때 호출
참고
'안드로이드' 카테고리의 다른 글
안드로이드 토이 프로젝트#3 - 이미지 로드 HTTPConnection, Picasso 라이브러리 (0) | 2019.04.04 |
---|---|
안드로이드 토이 프로젝트#2 - HTTP Connection HttpURLConnection 사용하기 (0) | 2019.03.27 |
안드로이드 토이 프로젝트#1 - RecyclerView 적용 (0) | 2019.03.25 |
이 글을 공유하기