[안드로이드] 네트워크-Retrofit(Callback)

나고수·2021년 9월 6일
0

andriod

목록 보기
5/27
post-thumbnail

RestAPI와 통신을 도와주는 라이브러리 Retrofit을 callback 방식으로 사용해보기 실습

내가 공부한 바로는, 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,
    )
}

Tip!

서버와의 통신 후 리턴되는 data는 JSON to Kotlin Class 플러그인으로 간편하게 생성 할 수 있다.

profile
되고싶다

0개의 댓글