Kotlin (Ktor) 请求 class 多部分表单数据
Kotlin (Ktor) request class for multipart form data
我想创建一个请求 class 来收集所有部分(文件和项目)并对其进行验证,这类似于我在 json 请求中放置的示例(下面)。
请求 JSON 可序列化示例 CLASS
import kotlinx.serialization.Serializable
@Serializable
class CreateGroupRequest(
val name: String,
val description: String? = null,
val visibility: String? = "PUBLIC"
)
处理JSON请求示例
route("create") {
post {
val request = call.receive<CreateGroupRequest>()
try {
//CODE
call.respond(HttpStatusCode.OK)
} catch (e: SharedDomainException) {
call.respond(HttpStatusCode(e.errorCode, e.errorMessage))
}
}
}
例如,我的意思是,在这种情况下,我想更改它,因为群组也有我要上传的个人资料照片,或者在其他情况下,帖子域有文本、作者和多张图片.
我已经阅读了这篇文章 ,但我看不出如何使通用 class 读取多部分请求而不必在每个处理程序中重复代码。
那么,有谁知道我如何在共享 class 中读取请求多部分表单数据正文并使用 kotlin/ktor 对其进行验证?
对于MultiPartData
对象,原则上可以使用ContentNegotiation and register a content converter for the multipart/form-data
Content-type. In the convertForReceive
method you can use CIOMultipartDataBase to parse multipart data and then deserialize it using kotlinx.serialization library. For deserialize
method call you need to provide a decoder,需要实现。
上述方法可行,但对于具有大型二进制正文的部分来说效率非常低,因为 HTTP 消息中的部分一个接一个地传递,因此所有部分都将被急切地读入内存。
我想创建一个请求 class 来收集所有部分(文件和项目)并对其进行验证,这类似于我在 json 请求中放置的示例(下面)。
请求 JSON 可序列化示例 CLASS
import kotlinx.serialization.Serializable
@Serializable
class CreateGroupRequest(
val name: String,
val description: String? = null,
val visibility: String? = "PUBLIC"
)
处理JSON请求示例
route("create") {
post {
val request = call.receive<CreateGroupRequest>()
try {
//CODE
call.respond(HttpStatusCode.OK)
} catch (e: SharedDomainException) {
call.respond(HttpStatusCode(e.errorCode, e.errorMessage))
}
}
}
例如,我的意思是,在这种情况下,我想更改它,因为群组也有我要上传的个人资料照片,或者在其他情况下,帖子域有文本、作者和多张图片.
我已经阅读了这篇文章
那么,有谁知道我如何在共享 class 中读取请求多部分表单数据正文并使用 kotlin/ktor 对其进行验证?
对于MultiPartData
对象,原则上可以使用ContentNegotiation and register a content converter for the multipart/form-data
Content-type. In the convertForReceive
method you can use CIOMultipartDataBase to parse multipart data and then deserialize it using kotlinx.serialization library. For deserialize
method call you need to provide a decoder,需要实现。
上述方法可行,但对于具有大型二进制正文的部分来说效率非常低,因为 HTTP 消息中的部分一个接一个地传递,因此所有部分都将被急切地读入内存。