How to pass to FormData not a string? Ktor

75 Views Asked by At
suspend fun postGov(
        number: Int,
        closeLocation: String,
        closeTime: String,
        openLocation: String,
        openTime: String,
        attachments: List<Attachment>
    ): Gov = httpClient.submitForm(
        url = "$baseUrl/$GOVS_TABLE",
        formParameters = parameters {
            append("number", number.toString())
            append("close location", closeLocation)
            append("close time", closeTime)
            append("open location", openLocation)
            append("open time", openTime)
            append("attachments", attachments)
        }
    ) {
        apiKeyHeader()
    }.body()

append only accepts strings, and I need to pass a list of items to FormData so that FormData is something like this

{
  "number": "123",
  "close time": "string",
  "close location": "string",
  "open time": "string",
  "open location": "string",
  "attachments": [{"url":"https://nocohub-001-prod-app-attachments.s3.us-east-2.amazonaws.com/nc/uploads/2023/10/21/08bca39258b20ad3e4300f2a76169d3fb02c5249/HPM8jgzGzuJqLDDbbk.png","title":"ktor_logo.png","mimetype":"image/jpeg","size":30207,"signedUrl":"https://nocohub-001-prod-app-attachments.s3.us-east-2.amazonaws.com/nc/uploads/2023/10/21/08bca39258b20ad3e4300f2a76169d3fb02c5249/HPM8jgzGzuJqLDDbbk.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIATUJCOBWTKOMQ5JMU%2F20231021%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20231021T104627Z&X-Amz-Expires=7413&X-Amz-Signature=f11c2918fd2e2c49caab3d405f794650dbad75dd5abcb52476bda3afdc56c96f&X-Amz-SignedHeaders=host&x-id=GetObject"}]
}

I tried to dig into the source code, but didn't find a convenient option

1

There are 1 best solutions below

0
On

EncodeToString from KotlinXSerialization helped.

This method makes json string from list.

import kotlinx.serialization.encodeToString

suspend fun postGov(
        number: Int,
        closeLocation: String,
        closeTime: String,
        openLocation: String,
        openTime: String,
        attachments: List<Attachment>
    ): Gov = httpClient.submitForm(
        url = "$baseUrl/$GOVS_TABLE",
        formParameters = parameters {
            append("number", number.toString())
            append("close location", closeLocation)
            append("close time", closeTime)
            append("open location", openLocation)
            append("open time", openTime)
            append("attachments", Json.encodeToString<List<Attachment>>(attachments))
        }
    )