2021. 3. 22. 14:09ㆍ개발/[Kotlin] 안드로이드 개발
Retrofit 2란?
Retrofit은 Square에서 만든 라이브러리입니다.
Android에서 HTTP API통신을 원할하고 편하게 사용하게 해줍니다.
Github : github.com/square/retrofit
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()로 보낸 후 끝이다.
'개발 > [Kotlin] 안드로이드 개발' 카테고리의 다른 글
[안드로이드 ROOM] MVVM패턴으로 배우는 ROOM DB(ViewModel, Repository, Koin, Coroutine) (0) | 2021.05.11 |
---|---|
[안드로이드] BroadcastReceiver 간단하게, 제대로 알자! with Kotlin (0) | 2021.03.22 |
[안드로이드] Navagation Safe Args를 사용해 데이터 전달 Fragment간 데이터전달 (0) | 2021.02.01 |
[안드로이드] TextView(텍스트뷰) 특정구간 글씨 크기조정 programmatically (0) | 2021.01.31 |
[안드로이드]네비게이션 드로어(Navigation Drawer) JetPack 제대로 쓰자! (0) | 2021.01.17 |