MultipartKit

Documentation Team Chat MIT License Continuous Integration Swift 5.7+

🏞 支持 Codable 的 Multipart 表单数据解析器和序列化器。

安装

使用 SPM 字符串可以轻松地将依赖项包含在您的 Package.swift 文件中。

将 MultipartKit 添加到您的包依赖项中

dependencies: [
    // ...
    .package(url: "https://github.com/vapor/multipart-kit.git", from: "4.0.0"),
]

将 MultipartKit 添加到您的目标依赖项中

targets: [
    .target(name: "MyAppTarget", dependencies: [
        // ...
        .product(name: "MultipartKit", package: "multipart-kit"),
    ])
]

支持的平台

MultipartKit 支持以下平台

概述

MultipartKit 是一个 multipart 解析和序列化库。它通过 FormDataEncoderFormDataDecodermultipart/form-data 媒体类型的特殊情况提供 Codable 支持。解析器通过适用于流式处理的回调函数来传递其解析输出。

Multipart 表单数据

让我们定义一个 Codable 类型并选择一个用于分隔 multipart 部分的边界。

struct User: Codable {
    let name: String
    let email: String
}
let user = User(name: "Ed", email: "ed@example.com")
let boundary = "abc123"

我们可以使用 FormDataEncoder 对我们的类型实例进行编码。

let encoded = try FormDataEncoder().encode(foo, boundary: boundary)

输出结果如下所示。

--abc123
Content-Disposition: form-data; name="name"

Ed
--abc123
Content-Disposition: form-data; name="email"

ed@example.com
--abc123--

为了解码此消息,我们将此输出和相同的边界提供给 FormDataDecoder,我们将获得与我们开始时相同的实例。

let decoded = try FormDataDecoder().decode(User.self, from: encoded, boundary: boundary)

关于 null 的说明

由于没有为如何在 Multipart 中表示 null 定义标准(与 JSON 等不同),因此 FormDataEncoder 和 FormDataDecoder 不支持分别编码或解码 null

嵌套和集合

嵌套结构可以通过命名部分来表示,以便它们描述使用方括号的路径来表示集合中包含的属性或元素。以下示例展示了实际情况。

struct Nested: Encodable {
    let tag: String
    let flag: Bool
    let nested: [Nested]
}
let boundary = "abc123"
let nested = Nested(tag: "a", flag: true, nested: [Nested(tag: "b", flag: false, nested: [])])
let encoded = try FormDataEncoder().encode(nested, boundary: boundary)

这会产生以下内容。

--abc123
Content-Disposition: form-data; name="tag"

a
--abc123
Content-Disposition: form-data; name="flag"

true
--abc123
Content-Disposition: form-data; name="nested[0][tag]"

b
--abc123
Content-Disposition: form-data; name="nested[0][flag]"

false
--abc123--

请注意,数组元素始终包含索引(而不是仅 []),以便支持复杂的嵌套。