[英]How to construct multipart form-data request with [String: Any] parameters
我已经找到了这段代码https://github.com/Kilo-Loco/URLSessionMPFD ,它构造了multipart form-data
但是当参数为[String: String]
时,此代码有效。 我的参数是[String: Any]
。 如何使用[String: Any]
?
仅显示了相关的代码,希望足以理解我的问题。
typealias Parameters = [String: String]
func construct() {
//let parameters = ["name": "MyTestFile123321","description": "My tutorial test file for MPFD uploads"]
let parameters: [String : Any] = [
"APIKey":apiKey,"accessToken":accessToken,
"user":["email":emailTextField.text!],
"profile":["name":nameTextField.text!,"dob":dateOfBirthTextField.text!
]
let dataBody = createDataBody(withParameters: parameters, media: [mediaImage], boundary: boundary)
}
func createDataBody(withParameters params: Parameters?, media: [Media]?, boundary: String) -> Data {
let lineBreak = "\r\n"
var body = Data()
if let parameters = params {
for (key, value) in parameters {
body.append("--\(boundary + lineBreak)")
body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
body.append("\(value + lineBreak)")
}
}
if let media = media {
for photo in media {
body.append("--\(boundary + lineBreak)")
//...
}
}
body.append("--\(boundary)--\(lineBreak)")
return body
}
extension Data {
mutating func append(_ string: String) {
if let data = string.data(using: .utf8) {
append(data)
}
}
}
尽管您最好确认服务器端框架是否可以处理这种类型的参数'name [key]',但您可以像下面那样进行操作。 许多现代框架都可以。
相关: 如何发布具有multipart / form-data编码的数组?
let parameters: [String : String] = [
"APIKey":apiKey,
"accessToken":accessToken,
"user[email]":emailTextField.text!,
"profile[name]":nameTextField.text!,
"profile[dob]":dateOfBirthTextField.text!
]
我已经尝试在您提到的github项目中使用以下参数。
// Try using this modified parameter in github project
let parameters = ["user": ["name": "MyTestFile123321",
"description": "My tutorial test file for MPFD uploads"],"profile": ["title": "This is big title"]] as [String : Any]
我有[String:Any]
更新代码
typealias Parameters = [String: Any]
func construct() {
// Change it with it your parameter
let parameters = ["user": ["name": "MyTestFile123321",
"description": "My tutorial test file for MPFD uploads"],"profile": ["title": "This is big title"]] as [String : Any]
let dataBody = createDataBody(withParameters: parameters, media: [mediaImage], boundary: boundary)
}
func createDataBody(withParameters params: Parameters?, media: [Media]?, boundary: String) -> Data {
let lineBreak = "\r\n"
var body = Data()
if let parameters = params {
for (key, value) in parameters {
if let sValue = value as? String {
body.append("--\(boundary + lineBreak)")
body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
body.append("\(sValue + lineBreak)")
}else{
if let dictionaryObj = value as? [String : String] {
for (key, value) in dictionaryObj {
body.append("--\(boundary + lineBreak)")
body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
body.append("\(value + lineBreak)")
}
}
}
}
}
if let media = media {
for photo in media {
body.append("--\(boundary + lineBreak)")
//...
}
}
body.append("--\(boundary)--\(lineBreak)")
return body
}
extension Data {
mutating func append(_ string: String) {
if let data = string.data(using: .utf8) {
append(data)
}
}
}
希望对您有帮助。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.