1. 준비사항
라이브러리 추가 (build.gradle.kts (module :app))
Retrofit
Gson
implementation ("com.squareup.retrofit2:retrofit:2.10.0")
implementation ("com.squareup.retrofit2:converter-gson:2.10.0")
인터넷 권한주기(manifast)
<uses-permission android:name="android.permission.INTERNET"/>
사용된 파일
MainActivity //액티비티
GithubService //코틀린파일 //network 패키지에 생성
Repo //데이터 클래스(data class) //model 패키지에 생성
2. 코드
1) MainActivity
package com.example.gitapi
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.gitapi.model.Repo
import com.example.gitapi.network.GithubService
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val githubService = retrofit.create(GithubService::class.java)
githubService.listRepos("chaesoobum").enqueue(object : Callback<List<Repo>> {
override fun onResponse(p0: Call<List<Repo>>, p1: Response<List<Repo>>) {
Log.e("Main(call)", p0.toString())
Log.e("Main(response)", p1.body().toString())
}
override fun onFailure(p0: Call<List<Repo>>, p1: Throwable) {
}
})
}
}
"chaesoobum"은 내 깃허브 유저명
2) GithubService
package com.example.gitapi.network
import com.example.gitapi.model.Repo
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path
interface GithubService {
//get으로 요청보내고 응답의형태는 리스트이고 repo에 저장
@GET("/users/{username}/repos")
fun listRepos(@Path("username") username: String): Call<List<Repo>>
}
3) Repo
package com.example.gitapi.model
import com.google.gson.annotations.SerializedName
data class Repo (
@SerializedName("id")
val id: Long,
@SerializedName("name")
val name: String,
@SerializedName("description")
val description: String,
@SerializedName("language")
val language: String?,
@SerializedName("stargazers_count")
val starCount: Int,
@SerializedName("forks_count")
val forksCount: Int,
@SerializedName("html_url")
val htmlUrl: String,
)
3. 결과 (메인액티비티의 로그, 로그캣에서 확인가능)
2024-03-29 00:19:11.231 8066-8066 Main(call) com.example.gitapi E retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall@ae21133
2024-03-29 00:19:11.231 8066-8066 Main(response) com.example.gitapi E [Repo(id=630767367, name=anyang_setup, description=null, language=Java, starCount=0, forksCount=0, htmlUrl=https://github.com/chaesoobum/anyang_setup), ....
4. 결과와 동작순서
git api로 보낸 요청과 api에서 받은 응답이 표시된다 응답에는 "chaesoobum" 유저의 레포지토리의 id,name,description, languae, stargazers_count, forks_count, html이 순서대로 나온다
동작순서는 처음에 메인액티비티에서 Retrofit 객체를 베이스url이 "https://api.github.com/" 인상태로 생성한다
이후에 Retrofit을 사용하여 GithubService 인터페이스의 인스턴스를 생성한다
GithubService에서는 Get 어노테이션을 사용하여 요청을 보내고 fun listrepo 를통해 결과를 Repo 데이터클래스에 저장한다
요청에는 로그의 정보보다 더많은 정보가 들어있다 나는 그중에 일부만 Repo 데이터 클래스에 저장하였다
저장한내용을 로그로 보여주는것이다