ios - 多部分请求 - 使用 UIImage 进行编码的结构

标签 ios json swift encodable

使用 Swift 5,我试图减少很多依赖项(Alamofire),并且我试图了解如何在使用 Codable 和 URLRequest 时执行多部分请求

我的代码可以正常工作,可以创建具有名称和电子邮件的用户,但我需要向结构中添加头像。

添加头像后,如何对结构进行编码才能成为多部分请求。 我在网上找到了一些解决方案,但不适用于我正在尝试实现的场景。

下面的代码是没有头像的请求的工作代码。

struct User: Codable {
    let name: String
    let email: String?
}
var endpointRequest = URLRequest(url: endpointUrl)
endpointRequest.httpMethod = "POST"
endpointRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
do {
   endpointRequest.httpBody = try JSONEncoder().encode(data)
} catch {
   onError(nil, error)
   return
}


URLSession.shared.dataTask(
    with: endpointRequest,
    completionHandler: { (data, urlResponse, error) in
        DispatchQueue.main.async {
            self.processResponse(data, urlResponse, error, onSuccess: onSuccess, onError: onError)
        }
}).resume()

最佳答案

UIImage 不符合 Codable,但您可以对 pngData 表示形式进行编码。然而,这需要实现Codable方法

struct User: Codable {
    let name: String
    let email: String?
    var avatar : UIImage?

    private enum CodingKeys : String, CodingKey { case name, email, avatar }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        email = try container.decodeIfPresent(String.self, forKey: .email)
        if let avatarData = try? container.decode(Data.self, forKey: .avatar) {
            avatar = UIImage(data: avatarData)
        }
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(email, forKey: .email)
        if let avatarImage = avatar {
            try container.encode(avatarImage.pngData(), forKey: .avatar)
        }
    }
}

或者将avatar声明为URL并单独发送图像

关于ios - 多部分请求 - 使用 UIImage 进行编码的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58164376/

相关文章:

swift - 使用 SwiftUI 时尝试在 View 上显示工作表时应用程序崩溃

javascript - UIWebView-stringByEvaluatingJavaScriptFromString : fill textbox in iFrame content?

json - 如何使用 JSON 路径提取器中提取的变量进行场景的进一步步骤?

arrays - 排序对象数组swift 4

java - 将 JSON 作为 HTTP POST 参数发送 (Android/Java)

javascript - 在 Node js 中将字符串转换为 JSON?

ios - 查询子数组中的对象

objective-c - UIView ContentMode 单元格图像的缩放模式在单元格被触摸(突出显示)后静默变化

ios - 将一个 Sprite 保留在屏幕内,但让其他 Sprite 离开

ios - 将 UIPageViewController 滑动与 iOS 7 UINavigationController 向后滑动手势相结合