首页 > 解决方案 > 在 Kotlin/Ktor 中可序列化的自定义多部分表单数据

问题描述

有谁知道如何编写convertForReceive自定义Multipart.FormData转换器的覆盖功能?

我想使用转换器将多部分请求转换为我的类,但我不知道它是如何工作的。

我有:

应用程序.kt

install(ContentNegotiation) {
    json()
    register(ContentType.MultiPart.FormData, CustomMultipartConverter)
}

自定义多部分转换器

object CustomMultipartConverter: ContentConverter {

    override suspend fun convertForReceive(context: PipelineContext<ApplicationReceiveRequest, ApplicationCall>): Any? {
        TODO("Not yet implemented")
    }

    override suspend fun convertForSend(
        context: PipelineContext<Any, ApplicationCall>,
        contentType: ContentType,
        value: Any
    ): Any? {
        TODO("Not yet implemented")
    }
}

请求课程

class CreatePostRequest(
   val text: String,
   val image: File? = null
)

路线

route("v1/posts") {
    authenticate {
        route("create") {
            val authJWT = call.authentication.principal as JWTAtuh
            val request = call.receive<CreatePostRequest>()
            //myCode
            call.respond(HttpStatusCode.OK)
        }
    }
}

标签: kotlinmultipartform-dataktor

解决方案


你可以SerializationConverter作为参考:

override suspend fun convertForReceive(context: PipelineContext<ApplicationReceiveRequest, ApplicationCall>): Any? {
    val request = context.subject
    val channel = request.value as? ByteReadChannel ?: return null
    val charset = context.call.request.contentCharset() ?: defaultCharset

    val serializer = format.serializersModule.serializer(request.typeInfo)
    val contentPacket = channel.readRemaining()

    return when (format) {
        is StringFormat -> format.decodeFromString(serializer, contentPacket.readText(charset))
        is BinaryFormat -> format.decodeFromByteArray(serializer, contentPacket.readBytes())
        else -> {
            contentPacket.discard()
            error("Unsupported format $format")
        }
    }
}

推荐阅读