예제를 통해 Retrofit2 라이브러리를 사용해보자 !
사용자 아이디를 검색하면 해당 사용자의 리포지토리 목록을 보여주는 앱을 만들어 보려고 한다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yuuuzzzin.githubapp">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.GithubApp">
// Retrofit2 라이브러리
def retrofit_version = "2.9.0"
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
Github REST API Current version를 보면 Base Url
이 https://api.github.com
라는 것을 알 수 있다.
BASE URL
? 데이터를 요청할 서버의 이름.BASE URL
뒤에 붙는 것에 따라 서버에 어떤 것을 요청하는 API인지 정해진다.GET
이 붙어있으므로 서버에 있는 데이터를 얻을 수 있는 API인 것을 알 수 있다./users/{username}/repos
부분이 BASE URL
뒤에 붙을 부분interface GithubService {
@GET("/users/{username}/repos?sort=created")
@Headers("Autorization: token 발급받은 키")
fun getRepos(@Path("username") username: String): Call<List<GithubRepo>>
}
/users/{username}/repos
를 넣고, 최근에 생성된 순으로 출력하기 위해 ?sort=created
를 붙였다.성공적으로 응답되는 Response의 예시이다.
json
형식data class GithubRepo(
@SerializedName("name")
val repoName: String,
@SerializedName("created_at")
val date: String,
)
object
사용object
는 singleton 이기 때문에 전역 변수처럼 앱의 모든 곳에서 접근 가능// singleton(메모리를 하나만 씀)
object RetrofitClient {
// retrofit client 선언
// BASE_URL을 private const 변수로 저장
private const val BASE_URL = "https://api.github.com/"
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val githubService: GithubService = retrofit.create(GithubService::class.java)
}
val githubService: GithubService = retrofit.create(GithubService::class.java)
retrofit.create(클라이언트 클래스(인터페이스))를 통해 클라이언트 생성
RetrofitClient.githubService.getRepos(username).enqueue(object : Callback<List<GithubRepo>> {
// 서버 통신 실패 시의 작업
override fun onFailure(call: Call<List<GithubRepo>>, t: Throwable) {
Log.e("실패", t.toString())
}
// 서버 통신 성공 시의 작업
// 매개변수 Response에 서버에서 받은 응답 데이터가 들어있음.
override fun onResponse(call: Call<List<GithubRepo>>, response: Response<List<GithubRepo>>)
{
// 응답받은 데이터를 가지고 처리할 코드 작성
val repos:List<GithubRepo>? = response.body()
repos?.forEach { it ->
Log.d("성공", it.toString())
}
}
})
execute()
/ 비동기enqueue(Callback<T> callback)
가 있다.
유진님 덕분에 막혀있는 부분이 뻥~ 뚫리는 느낌이네요!