안드로이드에서 REST API를 사용하기위해 HTTP 통신을 해야할 때 정말 유용하게 사용할 수 있는 라이브러리이다.
REST API란?
쉽게 이야기해 정해진 규격으로 URI에 정보들을 담아 통신하는 방법이다! 좀 더 자세하게는 다른 게시글에서 알아보자!
1. Gradle
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:retrofit-mock:2.6.2'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
Retrofit과 json을 위한 라이브러인 gson을 import해주자.
2. Data Class
data class Category(
@SerializedName("title")
val category: String,
@SerializedName("etc")
val etc: String,
@SerializedName("id")
val id: Int
)
데이터를 주고 받을 데이터 클래스를 만들어주자! 위의 코드에서 @SerializedName은 Json에서 Key에 해당한다. 그리고 나중에 클래스 인스턴스를 만들었을 때의 값이 value가 되어 전송된다.
3. API interface
interface DBService {
@GET("/category/read/{id}")
fun getCategory(
@Path("id") id: Int
): Call<List<GetCategory>>
@POST("/category/create")
fun categoryCreate(
@Body category: Category
): Call<GetStatus>
}
어노테이션으로 사용할 HTTP Method를 적어주고 매개변수로는 URI를 적어주자.
이떄 {}로 묶으면 동적으로 변수를 넣어 줄 수 있다!
@Body의 경우 Request의 Body로 값을 넣어주는 것이고 @Path는 URI 변수에 해당하는 값을 넣어주는 것이다.
* Retrofit에서 GET에 @Body를 사용하면 에러가 난다. GET의 원래 사용법과 맞지 않기 때문이다. Body를 실어야하는 경우 POST를 통해 넘겨주자.
Call안에 Return 받을 Json을 파싱할 수 있는 클래스를 넣어주자. 이는 2번의 Data Class의 형태로 만들어서 @SerializedName으로 선언해주면 Json을 알아서 파싱해준다.
4. Implement interface
object DBServiceImpl {
private const val BASE_URL = "http://localhost:3000"
private val retrofit: Retrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build()
val service: DBService = retrofit.create(DBService::class.java)
}
위에서 선언한 Retrofit interface를 빌더를 통해서 알맞게 빌드를 해주자.
5. 사용
private suspend fun categoryCreate(item: Category): String{
val call: Call<GetStatus> = DBServiceImpl.service.categoryCreate(item)
var statusCode = "default"
var job = CoroutineScope(Dispatchers.IO).launch {
var result = call.execute()
statusCode = result.body()!!.status
}
job.join()
return statusCode
}
코루틴말고 2번째 줄이 핵심이다. 4번에서 Implement한 객체를 통해 요청을 할 수 있다.
이때 동기적으로 통신할 때에는 execute()를, 비동기적으로 통신할 때에는 enqueue() 함수를 사용하면 된다!
enqueue()의 경우 성공을 처리하는 onResponse함수와 실패를 처리하는 onFailure함수를 override해주어야한다.
* 코루틴의 경우 다른 게시글에서 다루겠다!
참고 : http://devflow.github.io/retrofit-kr/
-끝-
'Android > 이것저것' 카테고리의 다른 글
[Android] 안드로이드 Room으로 로컬 데이터베이스 이용하기 (0) | 2020.10.25 |
---|---|
[Android] ViewPager2 (0) | 2020.10.11 |
[Android] Cleartext HTTP ~ bot permitted Error (0) | 2020.07.19 |
FloatingActionButton (0) | 2020.07.11 |
Fragment (0) | 2020.07.05 |
댓글