본문 바로가기
Kotlin

form data 를 string으로 변환하기

by ybs 2021. 11. 15.
반응형

content type application/x-www-form-urlencoded 으로 request body를 보낼 때 key=value 쌍 string 을 만들기 위한 코틀린 코드다. List<Pair<String, String>> 데이터 구조를 string 으로 만드는 encode 함수가 핵심이다. 추가적으로 item list를 FormData 로 만들어 flatten 시키는 부분도 있다.

typealias FormData = List<Pair<String, String>>

class FormDataTest {

    @Test
    fun formDataToString() {
        val baseFormData = getBaseForm()
        val itemFormData = listOf(
            Item("1", "food"),
            Item("2", "cloth")
        ).map { it.toFormData() }.flatten()

        assertEquals(
            "id=1&name=ybs&gender=m&job=developer&itemId=1&itemCode=food&itemId=2&itemCode=cloth",
            (baseFormData + itemFormData).encode()
        )
    }

    private fun getBaseForm(): FormData {
        val orderBaseForm = mutableListOf(
            "id" to "1",
            "name" to "ybs",
            "gender" to "m"
        )

        // 추가로 add 할수도 있음
        orderBaseForm.add("job" to "developer")
        return orderBaseForm
    }

    private fun FormData.encode(): String {
        return this
            .mapNotNull { (key, value) ->
                try {
                    "${URLEncoder.encode(key, "UTF-8")}=${URLEncoder.encode(value, "UTF-8")}"
                } catch (e: UnsupportedEncodingException) {
                    null
                }
            }
            .joinToString("&")
    }

    data class Item(
        val id: String,
        val code: String
    )

    private fun Item.toFormData(): FormData {
        return mutableListOf(
            "itemId" to this.id,
            "itemCode" to this.code
        )
    }
}
반응형