dev/aos

[AOS] Retrofit API 통신 기본 사용 방법

캄춰 2024. 1. 10. 09:21
728x90
반응형
plugins {
    id("com.android.application") version "8.1.2" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

 

dependencies {

    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.10.0")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")

    // NLog
    implementation("com.github.b3lon9:NLog:1.0.8")

    // retrofit
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
}

 

 

Retrofit에 사용될 서비스

서버에 설정된 메서드를 연결 해주는 것

Annotation이 일치해야 함

interface GitHubService {
    // https://jsonplaceholder.typicode.com/posts/{userId}
    // textId가 아닌 Path로 설정한 userId 입력
    @GET("posts/{userId}")
    fun getData(@Path("userId") textId: String): Call<PostsData>

    // https://jsonplaceholder.typicode.com/posts?{userId}=1
    // https://jsonplaceholder.typicode.com/posts?userId=1
    @GET("posts")
    fun getDataQuery(@Query("userId") textId: String): Call<List<PostsData>>


    @FormUrlEncoded
    @POST("posts")
    fun postData(@FieldMap param: HashMap<String, Any>): Call<PostsData>

    @PUT("posts/{userId}")
    fun putData(@Path("userId") userId: String): Call<PostsData>

    @GET("hello-spring")
    fun getHelloSpring(@Query("name") name: String): Call<ResponseBody>
}

 

 

연습용 데이터 클래스 

data class PostsData(
    val userId: Int,
    val id: Int,
    val title: String,
    val body: String
)

 

 

사용

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        NLog.i("onCreate..")

        val client = OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build()

        val retrofit = Retrofit.Builder()
            .baseUrl(Constants.PracticeURL.BASE_URL_LOCAL)
            .client(client)
            .build()

        val githubService = retrofit.create(GitHubService::class.java)

        githubService.getHelloSpring("neander").enqueue(object: Callback<ResponseBody> {
            override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                NLog.d("onResponse.. call:$call.. response:$response")
                val body = response.body()

                NLog.w("neander", "body ...." + body?.string()+ "...middle check..." + response)
            }

            override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                NLog.e("onFailure.. call:$call.. error:${t.stackTraceToString()}")
            }
        })


    }

 

Retrofit을 이용한 함수

    private fun getTest(service: GitHubService) {
        service.getData("1").enqueue(object: Callback<PostsData> {
            override fun onResponse(call: Call<PostsData>, response: Response<PostsData>) {
                NLog.d("onResponse.. response:$response")
                NLog.d("onResponse.. response:${response.body()}")
                val data: PostsData? = response.body()
                data?.let {
                    NLog.d("data:$data")
                }
            }

            override fun onFailure(call: Call<PostsData>, t: Throwable) {
                NLog.e("onFailure1.. call:$call")
                NLog.e("onFailure2.. error:${t.stackTraceToString()}")
            }
        })
    }

    private fun getQueryTest(service: GitHubService) {
        service.getDataQuery("2").enqueue(object: Callback<List<PostsData>> {
            override fun onResponse(
                call: Call<List<PostsData>>,
                response: Response<List<PostsData>>
            ) {
                NLog.d("onResponse.. response:$response")
                if (response.isSuccessful) {
                    val datas: List<PostsData>? = response.body()
                    datas?.let {
                        NLog.d("size:${datas.size}")
                        NLog.d("datas:$datas")
                    }
                } else {

                }
            }

            override fun onFailure(call: Call<List<PostsData>>, t: Throwable) {
                NLog.e("onFailure.. error:${t.stackTraceToString()}")
            }
        })
    }

 

 

예제용 서버

object Constants {
    object PracticeURL {
        const val BASE_URL_1 = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/"
        const val BASE_URL_2 = "https://jsonplaceholder.typicode.com/"
         const val BASE_URL_LOCAL = "http://192.1.40.86:8033/"
//        const val BASE_URL_LOCAL = "http://10.0.2.2:8033/"
    }
}
728x90
반응형

'dev > aos' 카테고리의 다른 글

[AOS] Android Studio Alt + F12 not work  (0) 2024.01.13
[AOS] Gradle Plugin, Version location  (0) 2024.01.12
[AOS] BuildType, Variant 빌드  (0) 2024.01.04
[AOS] SharedPreference 임시저장  (0) 2023.12.15
[AOS] NumberPicker 선택  (0) 2023.12.15