Retrofit2 사용하기
2021. 5. 31. 16:39
네트워크 관련 라이브러리 중 하나인 Retrofit을 사용해보았다.
Retrofit을 사용하기 위해 권한을 추가해줘야한다.
implementation 'com.squareup.retrofit2:retrofit:2.6.4'
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
activity에 retrofit을 만들고 baseUrl을 적는다.
baseUrl은 URL 중 변하지 않는 도메인 주소를 뜻한다.
서버로부터 데이터를 받아와서 원하는 타입으로 데이터를 바꾸기 위해
addConverterFactory(GsonConverterFactory.create())를 사용한다.
val retrofit = Retrofit.Builder()
.baseUrl("http://mellowcode.rog/")
.addConverterFactory(GsonConverterFactory.create())
.build()
retrofit에서는 baseURL 뒷부분을 쉽게 관리할 수 있도록 interface 구조 제공한다.
어노테이션(@)을 사용하여 Request Type을 정의하고 value 값은 baseURL 뒷부분으로 한다.
Request Type은 다음과 같다.
- GET : 정보 요청
- POST : 정보 추가 요청
- DELETE : 정보 삭제 요청
- PUT : 정보 수정 요청
이를 호출하기 위한 함수를 만들어 최종적으로 원하는 타입을 Call 타입으로 받는다.
package com.example.prac_android
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
interface RetrofitService {
@GET("json/students/")
fun getStudentsList() : Call<ArrayList<PersonFromServer>>
@POST("json/students/")
fun createStudent(
@Body person : PersonFromServer
) : Call<PersonFromServer>
}
activity에서 데이터 통신을 위해 서비스를 retrofit에 연결시킨다.
val service = retrofit.create(RetrofitService::class.java)
GET 요청
연결시킨 service에 getStudentsList()를 호출한다.
통신 실패할 경우 onFailure로 들어가고
통신 성공할 경우 onResponse로 들어가게 된다.
service.getStudentsList().enqueue(object : Callback<ArrayList<PersonFromServer>> {
override fun onFailure(call: Call<ArrayList<PersonFromServer>>, t: Throwable) {
Log.d("retrofitt", "GET ERROR : " + t.message)
}
override fun onResponse(
call: Call<ArrayList<PersonFromServer>>,
response: Response<ArrayList<PersonFromServer>>
) {
//통신이 잘 된 경우
if (response.isSuccessful){
val personList = response.body()
Log.d("retrofitt", "GET res : "+personList?.get(0)?.age)
}
}
})
POST 요청
POST할 정보를 params에 담은 후 createStudent를 호출한다.
GET과 마찬가지로 onFailure는 전송 실패를, onResponse는 성공을 의미한다.
val params = PersonFromServer(name = "김철수", age = 12, intro = "하이철수")
service.createStudent(params).enqueue(object : Callback<PersonFromServer> {
override fun onFailure(call: Call<PersonFromServer>, t: Throwable) {
Log.d("retrofitt", "POST ERROR : " + t.message)
}
override fun onResponse(
call: Call<PersonFromServer>,
response: Response<PersonFromServer>
) {
if (response.isSuccessful) {
val person = response.body()
Log.d("retrofitt", "POST name : " + person?.name)
}
}
})
전체적인 activity는 다음과 같다.
package com.example.prac_android
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class RetrofitActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_retrofit)
val retrofit = Retrofit.Builder()
.baseUrl("http://mellowcode.org/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(RetrofitService::class.java)
// GET 요청
service.getStudentsList().enqueue(object : Callback<ArrayList<PersonFromServer>> {
override fun onFailure(call: Call<ArrayList<PersonFromServer>>, t: Throwable) {
Log.d("retrofitt", "GET ERROR : " + t.message)
}
override fun onResponse(
call: Call<ArrayList<PersonFromServer>>,
response: Response<ArrayList<PersonFromServer>>
) {
//통신이 잘 된 경우
if (response.isSuccessful){
val personList = response.body()
Log.d("retrofitt", "GET res : "+personList?.get(0)?.age)
val code = response.code()
val error = response.errorBody()
val header = response.headers()
}
}
})
//POST 요청
val params = PersonFromServer(name = "김철수", age = 12, intro = "하이철수")
service.createStudent(params).enqueue(object : Callback<PersonFromServer> {
override fun onFailure(call: Call<PersonFromServer>, t: Throwable) {
Log.d("retrofitt", "POST ERROR : " + t.message)
}
override fun onResponse(
call: Call<PersonFromServer>,
response: Response<PersonFromServer>
) {
if (response.isSuccessful) {
val person = response.body()
Log.d("retrofitt", "POST name : " + person?.name)
}
}
})
}
}
728x90
'💻개발 > Android' 카테고리의 다른 글
ViewModel 사용하기 (0) | 2021.06.05 |
---|---|
기본 이미지 추가하기 (0) | 2021.06.04 |
Async (0) | 2021.05.30 |
TabLayout과 Pager (0) | 2021.05.29 |
리스트뷰 그리는 방법3 : RecyclerView (0) | 2021.05.28 |