티스토리 뷰

반응형

지금까지 개인 프로젝트를 진행할때는 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정리는 여기에 해놨다. 

 

[Android][Kotlin] Retrofit annotation (@Path, @Query, @Field, @Body)

@Path와 @Query의 차이점 @Path: path variable을 위함 api/member/{username} @Query: query parameter 위함 api/member?username= @Field와 @Query의 차이점 @Query:사용시 파라미터를 url 뒤에 붙여서 전달하는..

yuuj.tistory.com

 

 

 

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()) }
                        )
    }

}

 

성공!

반응형