[안드로이드] Retrofit2를 사용한 GET/POST 서버통신 with Kotlin

2021. 3. 22. 14:09개발/[Kotlin] 안드로이드 개발

반응형

Retrofit 2란?

Retrofit은 Square에서 만든 라이브러리입니다.

Android에서 HTTP API통신을 원할하고 편하게 사용하게 해줍니다.

Github : github.com/square/retrofit

 

square/retrofit

A type-safe HTTP client for Android and the JVM. Contribute to square/retrofit development by creating an account on GitHub.

github.com

Retrofit 사용하기 위한 Android 권한 설정

build.gradle (APP 수준)

    // Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

Manifest

 // 권한 설정
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
   
// 안드로이드 보안 설정
android:usesCleartextTraffic="true"
android:hardwareAccelerated="true"

Singleton Object 생성

object RetrofitBuilder {
    var api: API

    init {
        val retrofit = Retrofit.Builder()
            .baseUrl("YOUR_URL")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        api = retrofit.create(API::class.java)
    }
}

서버 통신할 Activity나 Fragment에서 RetrofitBuilder.을 사용해 바로 사용할 수 있게 싱글턴 패턴으로 object를 만들어 줍니다. 레트로핏 객체를 만들었기 때문에 RetrofitBuilder.api로 어디서든 사용할 수 있습니다.

baseUrl은 변하지 않는 주소를 지정합니다 ex) http://1.5.7.9:8080

Interface 생성

interface API {
// x-www-urlencoded
    @FormUrlEncoded // x-www-urlencoded로 보내겠다.
    @POST("/rooms")
    fun post(@FieldMap param: HashMap<String, String>): Call<RoomsData> // FieldMap을 사용해 여러개의 변수를 보내겠다 선언

// Json
    @POST("/api/v1/init") // Call<InitializeResponse> 데이터를 받을 data class
    fun initRequest(@Body initializeRequest: InitializeRequest): Call<InitializeResponse> // InitializeRequest 요청을 보낼 Json Data Class
}

post 메서드를 통해 x-www-urlencoded타입으로 데이터를 보내보고 json타입으로 보내도록 하겠습니다.

@POST 어노테이션에 기본 URL + 추가 URL을 붙여주시면 됩니다.

 

MainActivity

1. 요청 DataClass 값을 정의한다.

     val initializeRequest = InitializeRequest(
            "",
            "",
            "",
            "", 
            "",
            "")

2. retrofit.POST Method로 서버 통신 요청

 RetrofitTwoBuilder.api.initRequest(initializeRequest).enqueue(object :Callback<InitializeResponse>{
            override fun onResponse(
                call: Call<InitializeResponse>,
                response: Response<InitializeResponse>
            ) {
                if(response.isSuccessful) {
                    Log.d("test", response.body().toString())
                      var data = response.body() // GsonConverter를 사용해 데이터매핑
                }
            }

            override fun onFailure(call: Call<InitializeResponse>, t: Throwable) {
           Log.d("test", "실패$t")
            }

        })

※ 요청할 데이터를 initRequest의 매개변수로 넣어주고 enqueue 후 받을 API Response Data를 callback에 등록한다.

서버 통신에 성공하면 data.으로 객체에 접근할 수 있다. 진짜 편하다....

 

 

이번엔 x-www-urlencoded로 통신해보자.

Singleton Object 생성

object RetrofitBuilder {
    var api: API

    init {
        val retrofit = Retrofit.Builder()
            .baseUrl("YOUR_URL")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        api = retrofit.create(API::class.java)
    }
}

아까와 같다.

Interface 생성

 @FormUrlEncoded
    @POST("/rooms")
    fun post(@FieldMap param: HashMap<String, String>): Call<RoomsData>

이제 딱 감이 올 것이다.

RetrofitBuilder.api.post(보낼데이터).enque 이런식으로 서버 통신을 한다.

MainActivity

    var input = HashMap<String, String>()
        input["college"] = "TEST"
        RetrofitBuilder.api.post(input).enqueue(object: Callback<RoomsData> {
            override fun onResponse(call: Call<RoomsData>, response: Response<RoomsData>) {
                if(response.isSuccessful) {
                    Log.d("test", "연결성공")
                    var a: RoomsData = response.body()!!
                    Log.d("test", a.rooms[0].seat[0][0].toString())
                }
            }

            override fun onFailure(call: Call<RoomsData>, t: Throwable) {
               Log.d("test", "연결실패")
            }

        })

HashMap으로 데이터를 연결해주고 post 하고 response data class인 roomsdata로 받아온 모습이다.

 

GET방식

GET방식은 더 너무 간단하다.

Interface 생성

@GET("블라블라")
fun getRequest() : Call<받을자료형>

Singleton Object 생성

위와 동일.

MainActivity

RetrofitBuilder.api.getRequest().enque~~~

getRequest()로 보낸 후 끝이다.

 

반응형