Developer Geek

Retrofit2 in Kotlin 본문

안드로이드/Network

Retrofit2 in Kotlin

devGeek 2022. 5. 30. 13:41
반응형

개요

  • 모바일에서 HTTP API 통신을 할 때 사용하는 라이브러리이다.
  • REST 기반의 웹서비스를 통해 JSON 구조를 쉽게 가져오고 업로드할 수 있다.

HTTP API를 Interface로 구현할 수 있다.

interface GitHubService {
    @GET("users/{user}/repos")
    fun listRepos(
        @Path("user") user: String
    )
}

Retrofit class는 위에서 정의한 GitHubService Interface의 구현체를 생성한다.

val retrofit = Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build()

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

각각의 GitHubService에서 만들어진 Call은 동기적 또는 비동기적으로 HTTP request를 해당 웹 서버에 요청할 수 있다.

val repos = service.listRepos("octocat")

HTTP request 를 명시적으로 사용하기 위해서 annotation을 사용한다.

  • URL parameter replacement and query parameter support
  • Object conversion to request body (e.g., JSON, protocol buffers)
  • Multipart request body and file upload

API 정의

함수 위에 있는 Anotation 그리고 Parameter는 HTTP request가 어떤 방식으로 요청 처리 되는지를 잘 명시한다.

REQUEST METHOD

  • 모든 함수는 HTTP annotation상대적인 URL 정보를 가지고 있어야한다.
  • Retrofit에서는 8가지의 annotation을 제공한다.
    • {HTTP, GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD}
      @GET("users/list")
  • query parameter들을 URL에 추가할 수 있다.
  • @GET("users/list?sort=desc")

URL MANIPULATION

Request URL은 함수의 파라미터를 통해 동적으로 바뀌는 값을 사용하기도 한다. URL에 표기할 때에는 { } 중괄호를 사용한다. 그리고 함수의 파라미터에서는 @Path("") annotation을 사용한다.

Path Param

@GET("group/{id}/users")
fun groupList(
    @Path("id") groupId: Int
): Call<List<User>>

Query Param

Query Parameters도 Request에 추가할 수 있다. @Query("") annotation을 사용한다.

@GET("group/{id}/users")
Call<List<User>> groupList(
    @Path("id") int groupId,
    @Query("sort") String sort
);

Complex Query Param - Map

@GET("group/{id}/users")
fun groupList(
    @Path("id") groupId: Int,
    @QueryMap option: Map<String, String>
): Call<List<User>>

REQUEST BODY

객체를 HTTP request body로 사용되기 위해 @Body annotation을 이용하여 body를 추가할 수 있다.

@POST("users/new")
fun createUser(
    @Body user: User
): Call<User>

User user 객체는 Retrofit 객체로 변환되다.

FORM ENCODED AND MULTIPART

Form-encoded 데이터는 FormUrlEncoded annotation을 이용해서 함수에 추가할 수 있다.
각 각의 key-value@Field를 사용하면 된다.

@FormUrlEncoded
@POST("user/edit")
fun updateUser(
    @Field("first_name") first: String,
    @Field("last_name") last: String
): Call<User>

Multipart request@Multipart를 명시한 후, @Part annotation을 이용하여 파라미터를 정의해주면 된다.

@Multipart
@PUT("user/photo")
fun updateUser(
    @Part("photo") photo: RequestBody,
    @Part("description") description: RequestBody
): Call<User>

Multipart를 사용할 때는 Retrofit 자체 converter를 이용하거나 자체적으로 구현한 RequestBody를 이용해 Serialization을 다룬다.

질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
zero5.two4@gmail.com

반응형
Comments