깨알 개념/Android

[Android] Retrofit - Post

interfacer_han 2024. 6. 11. 16:23

#1 이전 글

 

[Android] Retrofit - 기초

#1 이전 글 [Android] Retrofit - 배경과 구조#1 Restrofit의 배경#1-1 REST API REST API (REpresentational State Transfer Application Programming Interface)#1 무엇(What)에 대한 API인가?#1-1 개요REST(REpresentational State Transfer) 또는

kenel.tistory.com

위 게시글의 완성된 앱을 일부 수정해서, 서버에 Post 요청을 해본다. (참조: REST API)

#2 코드 수정

#2-1 AlbumService.kt

// package com.example.post

import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST


interface AlbumService {

    ...

    @POST("/albums")
    suspend fun uploadAlbum(@Body album: AlbumsItem): Response<AlbumsItem>
}

Post 요청 또한 반환형이 존재한다. 서버로 보낸 Post 요청이 어떻게 처리됐는가에 대한 응답(Response)가 필요하기 때문이다.

#2-2 MainActivity.kt

...

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        val responseLiveData: LiveData<Response<AlbumsItem>> = liveData {
            val album = AlbumsItem(7, 12, "Post practice") // AlbumsItem 객체를 하드 코딩
            val response = retrofitService.uploadAlbum(album)
            emit(response)
        }

        responseLiveData.observe(this, Observer {
            displayListOnScreen(textView, it)
        })
    }

    private fun displayListOnScreen(textView: TextView, response: Response<AlbumsItem>) {
        val item = response.body()

        if (item != null) {
            val result =
                "User id : ${item.userId}" + "\n" +
                "Album id : ${item.id}" + "\n" +
                "Album Title : ${item.title}" + "\n\n\n"

            textView.append(result)
        }
    }
}

LiveData Builder로 만든 responseLiveData를 수정한다. responseLiveData.observe 속에 있는 displayListOnScreen()도 알맞게 수정한다.

#3 작동 확인

#2-2에서 만든 Album 객체의 Album id는 12이었다. 그런데 어째서 서버에 Post된 id는 101인가? 이는 서버가 클라이언트가 정의한 id를 무시하고 알아서 id를 할당했기 때문이다. 데이터베이스에서 id는 거의 모두 자동 증가(Auto Increment)된다. 그래야 기본 키로서의 역할을 수행하기 위한 무결성을 갖출 수 있다. 반면, User id는 기본키도 아니고 중복을 허용하는 Column이기에 #2-2에서 정의한 값이 그대로 전달되었다.

#4 완성된 앱

 

android-practice/retrofit/Post at master · Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com