티스토리 뷰

728x90

https://thdbs523.tistory.com/376

 

[안드로이드/코틀린] Retrofit2 라이브러리로 JSON 데이터 다루기 (GET, POST)

Retrofit Retrofit2는 HTTP 통신을 도와주는 라이브러리다. GET, POST, PUT, DELETED 등을 전달하면 서버에서 처리 후 여러 형태의 데이터로 응답을 제공받을 수 있다. 비슷한 역할을 하는 HttpURLConnection 이나 A

thdbs523.tistory.com

Retrofit2에 대한 기본 개념과 구현 기초 셋팅, GET/POST 구현 방법은 위 포스팅에서 설명했다.

 

이번에는 PUT/DELETE 함수를 구현하는 방법에 대해 알아보자.

저번 포스팅과 동일하게 JSON 데이터는 아래 url을 활용한다.

https://jsonplaceholder.typicode.com/posts

 

 

 

API 구현

interface API {
    @FormUrlEncoded
    @PUT("/posts/{id}")
    fun putPost(@Path("id") id: Int, @FieldMap param: HashMap<String, Any>): Call<Post>

    @DELETE("/posts/{id}")
    fun deletePost(@Path("id") id: Int): Call<Void>
}

 

 

- PUT

    @FormUrlEncoded
    @PUT("/posts/{id}")
    fun putPost(@Path("id") id: Int, @FieldMap param: HashMap<String, Any>): Call<Post>

path로 전달한 id와 동일한 id를 가지는 데이터쌍을, parameter로 전달한 데이터로 변경한다.

https://jsonplaceholder.typicode.com/posts/1

처럼 path의 가장 뒤에 id를 전달하고, 변경할 데이터를 key-value 형태의 hashmap으로 전달한다.

그러면 반환값으로 변경된 데이터쌍이 Post 객체로 변형되어 반환된다.

 

여기서 path에 전달할 데이터는 @PUT("/posts/{id}") 처럼,

PUT 어노테이션 안에 {}로 넣는다.

그리고 함수의 파라미터에 @Path("id")를 통해 실제 path에 들어갈 데이터를 전달한다.

이 때 @PUT 경로의 {} 안 value와, @Path 안의 value의 이름이 동일해야 한다.

 

 

- DELETE

    @DELETE("/posts/{id}")
    fun deletePost(@Path("id") id: Int): Call<Void>

put과 동일하게, path로 전달한 id와 동일한 id를 가진 데이터쌍을 삭제한다.

이때도 @DELETE 어노테이션의 경로 {} 안에 전달할 데이터명을 넣고,

함수의 파라미터 @Path에 그 데이터를 전달한다.

 

DELETE는 응답값이 없기 때문에 반환값은 Call<Void>로 선언했다.

성공적으로 데이터를 삭제한 경우 응답코드가 200이 된다.

 

 

 

함수 직접 사용하기

- PUT

        val map = HashMap<String, Any>()
        map["title"] = "타이틀"
        map["userId"] = 3

        RetrofitBuilder.api.putPost(3, map).enqueue(object : Callback<Post> {
            override fun onResponse(call: Call<Post>, response: Response<Post>) {
                if (response.isSuccessful) {
                    Log.d(TAG, "putPost onResponse()")

                    val body = response.body()
                    Log.d(TAG, "userId: ${body?.userId}")
                    Log.d(TAG, "id: ${body?.id}")
                    Log.d(TAG, "title: ${body?.title}")
                    Log.d(TAG, "body: ${body?.body}")
                }
            }

            override fun onFailure(call: Call<Post>, t: Throwable) {
                Log.d(TAG, t.localizedMessage)
            }
        })

변경할 데이터는 미리 hashmap에 담아서 파라미터로 전달했다.

이 코드에서는 id가 1인 데이터의 title과 userId를 변경한다.

테스트를 위해 변경된 Post 객체의 값을 로그로 찍어봤다.

 

 

- DELETE

        RetrofitBuilder.api.deletePost(5).enqueue(object : Callback<Void> {
            override fun onResponse(call: Call<Void>, response: Response<Void>) {
                if (response.isSuccessful) {
                    Log.d(TAG, "deletePost onResponse()")
                    Log.d(TAG, "response code : ${response.code()}")
                }
            }
            
            override fun onFailure(call: Call<Void>, t: Throwable) {
                Log.d(TAG, t.localizedMessage)
            }
        })

인자로 5를 전달했으므로 id가 5인 데이터를 삭제하는 코드가 될 것이다.

DELETE 함수는 응답값이 없고, 성공적으로 삭제된 경우에는 응답 코드가 200이 반환이 된다.

이 코드를 실행시켜보면 "response code : 200"이라는 로그가 찍히는 것을 확인할 수 있다.

 

 

 

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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
글 보관함