저번 포스트에서는 newsapp에 하단 navigationview를 추가해 보았는데요 이 포스트에서는 레트로핏을 사용하기 위해 필수 요소들을 알아보도록 하겠습니다.
JSON to Kotlin class 플러그인/dependencies 다운로드
Json파일을 코틀린클래스로 바꿔주는 플러그인을 다운로드합니다.
dependencies도 추가해주세요
dependencies {
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation "com.squareup.okhttp3:logging-interceptor:4.5.0"
}
API Key 받아오기
이번 예제에서는 News API를 사용하도록 하겠습니다.
계정을 만들어주신 후 api키를 받습니다.
API URL이해
api를 쓰기 전에 이해를 돕기 위해 url 구성을 살펴보겠습니다.
- 빨간색 박스는 baseURL입니다.
- 초록색 박스는 endpoint입니다
- 파란색은 파라미터 들입니다. 예시에서 q는 뉴스 검색 키워드 값입니다. 위 예시에서는 apple과 관련된 기사를 찾게 됩니다. 파라미터를 추가하여 가져올 정보를 customize 할 수 있습니다. 이번에 쓰는 newsApi에 쓸 수 있는 파라미터는 아래 링크에서 확인하실수 있습니다.
- 핑크색 박스는 api key입니다.
이 위에 url을 아래 인터페이스를 만들 때 설정해주게 됩니다.
JSON을 kotlin class로 변환해주기
위에서 JSON string을 kotlin으로 변환해주기 위해 플러그인을 다운로드하였습니다. 아래 이미지는 newsapi에 나와있는 api호출 예시입니다. 이 JSON string을 이용해서 kotlin class를 만들어 주겠습니다.
GET URL을 복사해서 새로운 탭에 열어주고 ctrl + a 후 string을 모두 복사해줍니다.
이제 플러그인을 사용하여 JSON string을 kotlin class로 만들어 줍니다.
위와 같이 3개의 코틀린 클래스가 만들어집니다.
Retrofit으로 api 사용하기
레트로핏을 사용하기 위해 3가지가 필요합니다.
1. Interface
2. Constant
3. Retrofit Instance
편의를 위해 새로운 패키지를 만들어주겠습니다. 새로운 패키지 이름은 api로 하였습니다. 이 패키지에 레트로핏 관련 파일들을 모두 넣어주겠습니다.
Interface 만들기
api폴더 아래에 인터페이스를 만들어줍니다.
이제 newsapi 인터페이스를 만들어 주겠습니다.
newsAPI 공식 사이트를 보시면
@get("v2/top-headlines")는 헤드라인 뉴스만 가져오게 합니다. 그리고 get으로 써준 endpoint는 base URL인 https://newsapi.org/ 뒤에 붙게 됩니다. 그리고 endpoint뒤에는 파라미터들이 붙게 됩니다.
.
interface NewsApi {
@GET("v2/top-headlines") //우리는 headline news만 가져올것이기 때문에 엔드포인트를 v2/top-headlines로 설정해줍니다.
suspend fun getBreakingNews(
//Suspend는 안에있는 함수들이 실행될때까지 다른 스레드를 멈추게 합니다.
//다 불러오지 못했는데 다른 작업이 데이터를 요청하면 에러를 불러올수있기때문에 suspend를 사용하면 안전하게 데이터를 가져올수있습니다.
@Query("country") //parameter를 넣어줍니다.
countryCode:String = "us", //기본값으로 US를 넣어주었습니다.
@Query("page")
pageNumber:Int =1,
@Query("apiKey")
apiKey:String = API_KEY //편의를 위해 API_KEY를 constant 클래스에 모아서 관리하겠습니다.
): Response<NewsResponse> //플러그인을 통해 만들어 주었던 데이터 클래스를 연결해줍니다.
//두번째 엔드포인트는 everything을 써주었습니다. 위 방식과 동일합니다.
@GET("v2/everything")
suspend fun searchForNews(
@Query("q")
searchQuery:String,
@Query("page")
pageNumber:Int =1,
@Query("apiKey")
apiKey:String = API_KEY
):Response<NewsResponse>
}
Constant 만들기
constants 클래스를 만들어 주고 여기서 API KEY와 base URL을 관리하겠습니다.
아래처럼 constant class에 APIKEY와 BASEURL을 추가해줍니다.
class Constants {
companion object{
const val API_KEY = "발급받은 apikey를 복사 붙여넣기 해주세요"
const val BASE_URL = "https://newsapi.org"
}
}
Retrofit Instance 만들기
api패키지 안에 retrofit instance를 만들어 보겠습니다.
class RetrofitInstance {
companion object{
private val retrofit by lazy{
//인터셉터 추가
val logging = HttpLoggingInterceptor()
logging.setLevel(HttpLoggingInterceptor.Level.BODY)
//클라이언트 생성
val client = OkHttpClient.Builder()
.addInterceptor(logging)
.build()
//api에서 Json으로 가져온 데이터를 gson으로 코틀린에서 읽기 가능하게 변환 하는작업
Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
}
val api by lazy{
retrofit.create(NewsApi::class.java)
}
}
}
이렇게 만들면 앱으로 api호출까지 가능해집니다. 이제 이 불러온 데이터를 사용하는 방법을 다음 포스트에 다뤄보겠습니다.
참고