티스토리 뷰
[Android][Kotlin] Retrofit2 사용해서 통신하기 (@GET, @POST, @FormUrlEncoded)
yoo.o 2021. 1. 14. 18:09지금까지 개인 프로젝트를 진행할때는 Volley를 주로 사용했지만 회사에서 Retrofit2를 사용하고 있고, Volley보다 속도가 더 빠르다고 해서 새로 공부할겸 테스트 해봤다.
환경설정
AndroidManifest.xml
먼저 manifest에 인터넷 사용 권한과 클리어텍스트 허용을 추가해준다.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:usesCleartextTraffic="true"
/..
참고로 인터넷 사용 허용을 안해줄 경우 socket failed: EACCESS (permission denied)에러가,
클리어 텍스트 허용을 안해주면 UnknownServiceException CLEARTEXT communication not permitted 에러가 난다.
그 후 build.gradle(app)의 dependencies안에 이 코드들을 추가해준다.
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation "com.squareup.retrofit2:converter-scalars:2.1.0"
implementation group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.4.0'
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
(최신 버전으로 할 경우 싱크가 안맞는 경우도 있어서 그냥 이렇게 진행했다)
GET
UserRequest.kt
참고로 이 페이지에서 import를 잘못하는 경우 메인에서 에러가 난다.
Observable을 io.reactivex.Observable이 아닌 android.database.Observable을 한다거나 할 경우... subscribeOn에서 에러가 났음
import io.reactivex.Observable
import com.google.gson.GsonBuilder
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.scalars.ScalarsConverterFactory
import retrofit2.http.GET
interface UserRequest {
@GET("/member/register")
fun getuserinfo():
Observable<String>
companion object {
var gson = GsonBuilder()
.setLenient()
.create()
fun create(): UserRequest {
val retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create() )
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl("http://x.x.x.x:5000/")
.build()
return retrofit.create(UserRequest::class.java)
}
}
}
MainActivity.kt
일단 통신이 되는지만 간단하게 확인하기 위해 제이슨 형태로 스트링을 리턴하는 서버를 하나 띄웠고,
성공할 경우 그 결과값을 파싱하지않고 그대로 출력하도록 코드를 짰다.
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getUserinfo()
}
val userAPIserve by lazy {
UserRequest.create()
}
var disposable: Disposable? = null
private fun getUserinfo() {
disposable =
userAPIserve.getuserinfo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result -> Log.d("RESULT:", result) },
{ error -> Log.d("RESULT:", error.message.toString()) }
)
}
}
결과는 이렇게 잘 찍힌다.
POST
그다음엔 POST를 테스트하기 위해 파라미터를 보내면 그대로 리턴해주는 주소를 만들었다.
UserRequest.kt
@FormUrlEncoded
@POST("/posttest")
fun postTest(@Field("value") param: String):
Observable<String>
사용한 annotation정리는 여기에 해놨다.
MainActivity.kt 에서는 GET과 똑같은 방식으로 넣어주고, 전달할 파라미터만 추가해줬다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
postTest("success!") // 여기 넣어 보낸 값을 웹서버에서 리턴해줌
}
val userAPIserve by lazy {
UserRequest.create()
}
var disposable: Disposable? = null
private fun postTest(param: String){
disposable =
userAPIserve.postTest(param)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result -> Log.d("RESULT:", result) },
{ error -> Log.d("error:", error.message.toString()) }
)
}
}
성공!
- Total
- Today
- Yesterday
- 백준 2003
- 백준
- 투포인터 알고리즘
- TextFormField keyboard
- 전화번호목록 파이썬
- 코틀린 바텀네비게이션
- 코틀린
- 안드로이드 카카오톡으로 로그인
- 코틀린 데이터바인딩
- 안드로이드
- 백준알고리즘
- 코틀린 리스트뷰
- 코틀린 뷰바인딩
- 시뮬레이터 키보드
- 파이썬 최대공약수
- Kotlin
- 카카오 기출
- 카카오 키해시
- counting sort
- flutter simultor
- 소수 구하기 파이썬
- 데이터바인딩 뷰바인딩 차이
- 프로그래머스
- 백준 1806
- 투포인터 알고리즘 파이썬
- 안드로이드 키해시
- kotlin fragment
- 백준 1644
- 카카오톡으로 로그인 오류
- 코틀린 뷰페이저
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |