【问题标题】:Custom multipart-form-data serializable in Kotlin/Ktor在 Kotlin/Ktor 中可序列化的自定义多部分表单数据
【发布时间】:2021-10-21 22:25:47
【问题描述】:

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

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

我有:

Application.kt

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

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)
        }
    }
}

【问题讨论】:

    标签: kotlin multipartform-data ktor


    【解决方案1】:

    您可以将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")
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2022-10-08
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多