모바일에서 HTTP API 통신을 할 때 사용하는 라이브러리
-> 안드로이드 애플리케이션에서 통신 기능에 사용하는 코드를 사용하기 쉽게 만들어놓은 라이브러리이다. REST기반의 웹서비스를 통해 JSON 구조를 쉽게 가져오고 업로드할수 있다.
개발자가 서버와 통신하기 위한 코드를 작성하기 쉽게 라이브러리로 만들어놓았기 때문!
Postman을 통해 api요청 반환결과값을 편하게 볼 수 있다.
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
converter-gson 은 JSON 을 object형식으로 변환하도록 도와준다.
http통신을 하기 때문에 인터넷 사용권한 추가 필요
<uses-permission android:name="android.permission.INTERNET"/>
서버 통신시 request body 또는 response body에서 사용할 JSON형태의 모델 클래스 작성 -> Kotlin에서는 data class 형태로 작성한다!
data class Book (
@SerializedName("itemId")val id:Long, //서버에서는 itemId라는 값을 가져와서, app에선 id라는 값으로
@SerializedName("title")val title:String,
@SerializedName("description")val description:String,
@SerializedName("coverSmallUrl")val coverSmallUrl:String
)
data class BestSellerDto (
@SerializedName("title") val title:String,
@SerializedName("item") val books:List<Book>
)
data class SearchBookDto (
@SerializedName("title") val title:String,
@SerializedName("item") val books:List<Book>
)
변수명은 원래 서버에서 사용하는 값과 똑같이 작성해야 된다.
만약 앱 내에서 다른 변수명으로 사용하고 싶다면 위의 코드처럼
' @SerializedName("서버에서 변수명") val 앱내변수명:자료형 ' 을 사용한다.
레트로핏에서 Service는 API를 정의하는 인터페이스를 말한다.
어떤 형태와 방식으로 통신을 할지 어노테이션과 파라미터를 지정하면 된다.
Service는 기본적으로 Call<> 객체를 반환한다.
서버의 api가 String을 반환한다고 가정하면
클라이언트는 Retrofit을 통해 Call<String.>을 받게 된다.
interface BookService {
@GET("/api/search.api?output=json")
fun getBookbyName(
@Query("key") apiKey:String, //요구하는 기본인자를 @Query형태로
@Query("query") keyword: String
): Call<SearchBookDto> //반환하는 값SearchBookDto
@GET("/api/bestSeller.api?output=json&categoryId=100")
fun getBestSeller(
@Query("key") apiKey:String
):Call<BestSellerDto>
}
서비스가 인터페이스 형식 -> API를 call할때 BookService를 이용할 수 없다. 따라서, retrofit 구현체가 필요하다.
val retrofit= Retrofit.Builder()
.baseUrl("https://book.interpark.com")
.addConverterFactory(GsonConverterFactory.create()) // Json데이터를 사용자가 정의한 Java 객채로 변환해주는 라이브러리
.build() //레트로핏 구현체 완성!
val bookService=retrofit.create(BookService::class.java) //retrofit객체 만듦!
baseUrl에는 API서버의 기본URL주소를 넣어준다!
bookService.getBestSeller("38845BE9BD0EBEDF271A2D5BC770C5BEEBB2D38910F504545CE384C6692DA6D4")
.enqueue(object: Callback<BestSellerDto>{
override fun onFailure(call: Call<BestSellerDto>, t: Throwable) {
//todo 실패처리
Log.d(TAG,t.toString())
}
override fun onResponse(call: Call<BestSellerDto>, response: Response<BestSellerDto>) {
//todo 성공처리
if(response.isSuccessful.not()){
return
}
response.body()?.let{
//body가 있다면 그안에는 bestSellerDto가 들어있을것
Log.d(TAG,it.toString())
it.books.forEach{ book->
Log.d(TAG,book.toString())
}
}
}
})
}
companion object{
private const val TAG="MainActivity"
}
}
실행시 다음과 같은 결과가 나온다.