【问题标题】:Kotlin (Ktor) request class for multipart form data多部分表单数据的 Kotlin (Ktor) 请求类
【发布时间】:2021-10-19 09:31:42
【问题描述】:

我想创建一个请求类来收集所有部分(文件和项目)并对其进行验证,类似于我在 json 请求中放置的示例(如下)。

请求 JSON 可序列化示例类

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

例如,我的意思是,在这种情况下,我想更改它,因为群组还有我要上传的个人资料照片,或者在其他情况下,帖子域包含文本、作者和多张图片。

我已阅读此stackOverflow post,但我不知道如何创建一个通用类来读取多部分请求,而无需在每个处理程序中复制代码。

那么,有谁知道我如何读取共享类中的请求 multipart-form-data 正文并使用 kotlin/ktor 对其进行验证?

【问题讨论】:

  • 您可以将所有需要重用的代码从您所指的帖子中移到单独的函数/扩展中。
  • @PhilipDukhov 不完全是。根据我所附答案的理解,multipart-form-data 的读取是针对具体情况的。如何创建一个通用类来读取多部分并将其放入请求类中?在 JSON 示例中,serializable 解析请求并将其放入一个类中。有没有可能做类似的事情?如何为多部分构建可序列化?
  • 据我所知,此示例将数据写入文件。我不太确定您希望如何从中解析课程?无论哪种方式,您都可以取出一些数据读取部分,然后根据需要处理数据。您是否要发送稍后要解析的巨大 JSON?添加一些您打算如何使用它的伪代码。

标签: kotlin multipartform-data ktor


【解决方案1】:

原则上,您可以将ContentNegotiationregister a content converter 用于multipart/form-data 内容类型。在convertForReceive 方法中,您可以使用CIOMultipartDataBase 解析多部分数据,然后使用kotlinx.serializationdeserialize 它。对于deserialize 方法调用,您需要为需要实现的MultiPartData 对象提供a decoder

上述方法可行,但对于具有大型二进制正文的部分效率非常低,因为 HTTP 消息中的部分一个接一个,因此所有部分都将被急切地读入内存。

【讨论】:

  • 嗨,我正在对转换器进行编程,但我无法获取 KType 的参数...似乎序列化程序获取了类似 val request = context.subject // val typeInfo = request 的参数。 typeInfo // and val arguments = typeInfo.arguments 但在我的自定义转换器中 typeInfo 是一个 Ktype (我的请求类)但是当我得到参数时总是为空。你知道如何获取 KType 的参数吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-27
  • 2016-12-17
  • 2012-03-16
  • 2016-11-11
  • 2013-02-12
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多