🏞 支持 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 解析和序列化库。它通过 FormDataEncoder
和 FormDataDecoder
为 multipart/form-data
媒体类型的特殊情况提供 Codable
支持。解析器通过适用于流式处理的回调函数来传递其解析输出。
让我们定义一个 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)
由于没有为如何在 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--
请注意,数组元素始终包含索引(而不是仅 []
),以便支持复杂的嵌套。