Retrofit 예제

최희창·2022년 6월 9일
0

REST에 대해

목록 보기
2/3

Retrofit을 이용한 공공데이터 API 사용.

  • Retrofit을 이용해 공공기관 데이터 API 사용을 연습해봅시다.

코로나 백신 예방 접종 통계 API

https://www.data.go.kr/index.do

공공데이터활용지원센터_코로나19 예방접종 통계 데이터 조회 서비스의 API를 사용해 봅시다.

API로 받아올 데이터 모델 파악.

  • 위 데이터 모델은 사이트에서 가이드 되는 데이터 모델입니다.
object DataClass {
    data class VaccineBody(
        @SerializedName("currentCount") val currentCount: Int,   // 현재 검색된 데이터 수
        @SerializedName("data") val data: List<Vaccine>,         // 백신 현황 데이터
        @SerializedName("matchCount") val matchCount: Int,       // 검색과 일치하는 데이터 수
        @SerializedName("page") val page: Int,                   // 데이터 페이지
        @SerializedName("perPage") val perPage: Int,             // 한번에 불러올 데이터
        @SerializedName("totalCount") val totalCount: Int        // 데이터 전체 개수
    ) {
        override fun toString(): String {
            return "$data\n\n" +
                    "currentCount : $currentCount\n" +
                    "matchCount : $matchCount\n" +
                    "page : $page\n" +
                    "perPage : $perPage\n" +
                    "totalCount : $totalCount"
        }
    }

    data class Vaccine(
        @SerializedName("accumulatedFirstCnt") val accumulatedFirstCnt: Int,     // 전일까지의 누적 통계 1차
        @SerializedName("accumulatedSecondCnt") val accumulatedSecondCnt: Int,   // 전일까지의 누적 통계 2차
        @SerializedName("baseDate") val baseDate: String,                        // 통계 기준일자
        @SerializedName("firstCnt") val firstCnt: Int,                           // 당일 통계 1차
        @SerializedName("secondCnt") val secondCnt: Int,                         // 당일 통계 2차
        @SerializedName("sido") val area: String,                                // 지역명칭
        @SerializedName("totalFirstCnt") val totalFirstCnt: Int,                 // 전체 누적 통계 1차
        @SerializedName("totalSecondCnt") val totalSecondCnt: Int                // 전체 누적 통계 2차
    ) {
        override fun toString(): String {
            return "Vaccine : [\n" +
                    "    accumulatedFirstCnt : ${accumulatedFirstCnt}\n" +
                    "    accumulatedSecondCnt : ${accumulatedSecondCnt}\n" +
                    "    baseDate : ${baseDate}\n" +
                    "    firstCnt : ${firstCnt}\n" +
                    "    secondCnt : ${secondCnt}\n" +
                    "    area : ${area}\n" +
                    "    totalFirstCnt : ${totalFirstCnt}\n" +
                    "    totalSecondCnt : ${totalSecondCnt}]\n\n"
        }
    }
}

-> 사이트에서 제공되는 데이터 모델을 코드로 구현한 부분입니다.

Rest API 인터페이스 구현

interface ApiService {

    @GET("15077756/v1/vaccine-stat")
    fun getInfo(
        @Query("page") Page: Int,
        @Query("perPage") PerPage: Int,

        @Query("serviceKey") ServiceKey: String =
            "kigiqUVF/dUWrJa3YwQhUztfv7vGj05wsvDBfcXUH39jcHP7AQwYqD9ey4QcqD3FiApVohgsA53YdV9u2EVEmA=="
    ): Call<DataClass.VaccineBody>
}
  • @GET("")에 들어가는 부분은 BASE_URL 뒤에 나오는, 즉 데이터를 받아올 URL을 선언한다.
  • @Query에는 API를 사용하기 위한 Parameter를 선언해준다.

Retrofit

  • Retrofit을 사용하기 위해 Retrofit 객체를 생성해야 한다.
object RetrofitObject {
    private fun getRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.odcloud.kr/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    fun getApiService(): ApiService {
        return getRetrofit().create(ApiService::class.java)
    }
}

Retrofit 사용하는 부분

    private fun getVaccineStatus() {

      RetrofitObject.getApiService().getInfo(
            1, 10
        ).enqueue(object : Callback<DataClass.VaccineBody> {
            override fun onResponse(
                call: Call<DataClass.VaccineBody>,
                response: Response<DataClass.VaccineBody>
            ) {
                setResponseText(response.code(), response.body())
                Toast.makeText(baseContext, "success", Toast.LENGTH_SHORT).show()
            }

            override fun onFailure(call: Call<DataClass.VaccineBody>, t: Throwable) {
                Log.e("retrofit onFailure", "${t.printStackTrace()}")
                Toast.makeText(baseContext, "fail", Toast.LENGTH_SHORT).show()
            }
        })
    }
profile
heec.choi

0개의 댓글