Android Retrofit2 POST form-data Body & Basic Auth

Test POST form-data Body & Basic Auth on Postman

SomeBasicAuth.kt

// 임의의 아이디, 비밀번호
val testId = "someTestId"
val testPw = "someTestPw"

// base64 인코딩
val basicAuth = Credentials.basic(testId, testPw)

val someRepository = SomeRepository(basicAuth)
val somePost = someRepository.createPost("someTitle", "someContent", "someExcerpt")

임의의 계정 정보를 base64로 인코딩한다. – (Basic Auth)
okhttp3의 Credentials.basic을 이용해 인코딩할 수 있다.

당연히, Basic Auth를 이용해 서버의 엔드포인트에 접근하려면 계정 정보가 유효해야 한다.

RestClient.kt

object RestClient {
    /**
     * 서버의 고정IP or 도메인
     */
    private const val baseUrl = "https://some.domain.co.kr/"
    /**
     * baseUrl 정보로 초기화된 [Retrofit]
     */
    private val retrofit = Retrofit.Builder()
        .baseUrl(baseUrl)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
    /**
     * [retrofit]의 [BoardService]
     */
    val boardService = retrofit.create(BoardService::class.java)
}

서버를 가리키는 baseUrl 정보로 retrofit 객체를 초기화한다.

BoardService.kt

interface BoardService {
    @FormUrlEncoded
    @POST("some/api/v2/endpoint/posts")
    fun createPost(@Header("Authorization") h1 : String,
                   @Field("status") status : String = "publish",
                   @Field("title") title : String,
                   @Field("content") content : String,
                   @Field("excerpt") excerpt : String) : Call<Post>
}

form-data Body를 POST방식으로 전송하기 위해 @FormUrlEncoded를 명시하고 @Field에 Key, Value를 포함한다. @Header(“Authorization”)은 base64 인코딩된 계정 정보(Basic Auth)를 헤더에 포함하여 전송한다.

만약, 올바른 Basic Auth라면 200 HTTP 상태 코드와 함께 JSON을 반환할 것이다.

SomeRepository.kt

class SomeRepository(val basicAuth : String) {
    fun createPost(title : String, content : String, excerpt: String) : Post? {
        val call = RestClient.boardService.createPost(basicAuth, title, content, excerpt)

        return call.execute().body()
    }
}

SomeRepository는 Basic Auth를 이용해 특정 엔드포인트에 접근할 수 있는 메소드를 포함하고 있다.

서버로 받은 JSON을 GsonConverter가 Post타입 객체로 직렬화해서 반환한다.


댓글 남기기