내가 공부한 바로는, Retrofit을 비동기형식으로 사용하기 위해서는
1. callback
2. rxjava
3. 코루틴
방식 중 하나를 이용해야 한다고 들었다.
그 중 1번 방법을 사용해서 비동기적으로 retrofit을 이용하고, 서버에서 데이터를 가져와 보는 실습을 해보자.
//RetrofitActivity.kt
class RetrofitActivity : AppCompatActivity() {
private lateinit var binding: ActivityRetrofitBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityRetrofitBinding.inflate(layoutInflater)
setContentView(binding.root)
//https://jsonplaceholder.typicode.com/posts
//아래 3줄로 httpurl에서 inputstrambuffer을 buffer로 읽고, josn을 gson으로 변환하는 과정을 모두 대체 할 수 있다 wow
val retrofit = Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/") // 바뀌지 않는 api
.addConverterFactory(GsonConverterFactory.create()) //josn to gson
.build()
val service = retrofit.create(RetrofitService::class.java)
//service - get
//enqueue>>직렬화
service.getPersonList().enqueue(object : Callback<ArrayList<Person>> {
//통신성공시
override fun onResponse(
call: Call<ArrayList<Person>>,
response: Response<ArrayList<Person>>
) {
if (response.isSuccessful) {
val personList = response.body()
Log.e(
"retorfitt",
personList?.get(0)?.body.toString() + response.code() + "errorbody" + response.errorBody() + response.headers()
)
}
}
//통신실패시
override fun onFailure(call: Call<ArrayList<Person>>, t: Throwable) {
}
})
// //service - post(1)
// val params = HashMap<String,Any>()
// params.put("userId",1)
// params.put("title","title2")
// params.put("body","body2")
//
//
// service.postPersonList(params).enqueue(object : Callback<Person>{
// override fun onResponse(call: Call<Person>, response: Response<Person>) {
// if(response.isSuccessful){
// val person = response.body()
// Log.e("retrofittt",person!!.title!!.toString())
// }
// }
//
// override fun onFailure(call: Call<Person>, t: Throwable) {
// TODO("Not yet implemented")
// }
// }
// )
//service - post(2)
//body에 person 객체를 넣어서 조금 더 간편하게 posts하기
val person = Person(100, "test3", "body3")
service.psotPersonListEasy(person).enqueue(object : Callback<Person> {
override fun onResponse(call: Call<Person>, response: Response<Person>) {
if (response.isSuccessful) {
Log.e("easyretrofit", response.body()!!.title.toString())
}
}
override fun onFailure(call: Call<Person>, t: Throwable) {
TODO("Not yet implemented")
}
})
}
}
//RetrofitService.interface
interface RetrofitService {
//baseurl 뒷부분
@GET("posts")
fun getPersonList(): Call<ArrayList<Person>> //<리턴형식
@POST("posts")
fun postPersonList(
@Body params: HashMap<String, Any>
): Call<Person>
//body에 person 객체를 넣어서 조금 더 간편하게 posts하기
@POST("posts")
fun psotPersonListEasy(
@Body person: Person
): Call<Person>
}
//Retrofit service 예제 2
interface CalendarService {
@GET("calendar")
suspend fun getCalendar(
@Header("Authorization") USER_ID: String
): Response<Calendar>
@POST("calendar")
suspend fun postCalendar(
@Header("Authorization") USER_ID: String,
@Body params: HashMap<String, String>
)
//path는 이런식으로 {}안에 적어주면 된다.
@PUT("calendar/{id}")
suspend fun putCalendar(
@Path("id") id: String,
@Header("Authorization") USER_ID: String,
@Body params: HashMap<String, String>
)
@DELETE("calendar/{id}")
suspend fun deleteCalendar(
@Path("id") id: String,
@Header("Authorization") USER_ID: String,
)
}
서버와의 통신 후 리턴되는 data는 JSON to Kotlin Class 플러그인으로 간편하게 생성 할 수 있다.