首页 > 解决方案 > Swift 5,具有多个主体参数的 multipart/form-data

问题描述

正如标题所示,我在使用 API 向服务器提交表单时遇到了问题。还有很多其他关于在 Swift 5 中将图像上传到服务器的帖子和教程,所以我目前有以下内容;

func request5(authToken: String, contextID: String, parameters: [String:Any], image: UIImage) {
        func getBase64Image(image: UIImage, complete: @escaping (String?) -> ()) {
            DispatchQueue.main.async {
                let imageData = image.pngData()
                let base64Image = imageData?.base64EncodedString(options: .lineLength64Characters)
                complete(base64Image)
            }
        }
        getBase64Image(image: image) { base64Image in
            let boundary = "Boundary-\(UUID().uuidString)"

            guard let url = URL(string: self.baseURL + contextID) else { return }

            let jsonData = try? JSONSerialization.data(withJSONObject: parameters)

            var body = ""
            body += "--\(boundary)\r\n"
            body += "Content-Disposition:form-data; name=\"post_picture_link\""
            body += "\r\n\r\n\(base64Image ?? "")\r\n"
            body += "--\(boundary)--\r\n"
            let postData = body.data(using: .utf8)

            var urlRequest = URLRequest(url: url)
            urlRequest.httpMethod = "POST"
            urlRequest.httpBody = jsonData

            let APIauthToken = "Bearer " + authToken
            urlRequest.addValue(APIauthToken, forHTTPHeaderField: "Authorization")
            urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
            urlRequest.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

            URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in

                do {
                    if let d = data {
                        let result = try JSONDecoder().decode(ProperResponseGen.self, from: d)
                        DispatchQueue.main.async {
                            self.response = result
                            self.hasFinished = true
                        }
                    } else {
                        print("No Data")
                    }
                } catch {
                    print(error)
                }

            }.resume()
        }
    }

在大多数情况下(据我所知),所有这些都很好,因为它可以在要提交的设置中包含图像和身体参数。问题是,正如您可能知道的那样,当我按照上面的方式编写它时,我有两个数据变量,postData 和 jsonData,它们都包含我需要的完整表单数据提交的单独部分。

为简单起见,假设 API 端点需要两个主体键;“post_picture_link”和“post_caption”,post caption被封装在传递给函数的参数变量中。

如何将它们组合成一个 httpBody?

标签: iosjsonswift

解决方案


推荐阅读