Swift multipart/form-data 上传时将字符串数组附加到正文(问题:数组作为字符串发送到服务器)
Swift multipart/form-data upload with append String Array to body (Issue: Array goes as String to Server)
我正在尝试使用 Alamofire Swift 库在多部分请求中向服务器发送一个字符串数组,我尝试了几种方法来对数组进行编码,但大多数时候它都是一个字符串。谁能帮我这个。除了数组发送图像上传和其他值可以正常发送到服务器。下面是我的代码。
var parameters: Parameters = [
"UEmail": userObj.email,
"UFirstName": fName,
"ULastName": lName,
"VisitedCountries": getVisitedCountryCodeList() //return String array
]
let headers: HTTPHeaders
headers = ["Content-type": "multipart/form-data"]
AF.upload(multipartFormData: { (multipartFormData) in
for (key, value) in parameters {
if let subArray = value as? NSArray {
do {
if(key == "VisitedCountries"){
let data = try JSONSerialization.data(withJSONObject: self.getVisitedCountryCodeList(), options: [])
multipartFormData.append(data, withName: "VisitedCountries" )
}
} catch {
print("error msg")
}
} else {
multipartFormData.append((value as! NSString).data(using: String.Encoding.utf8.rawValue)!, withName: key )
}
}
if(self.selectedProfileImage != nil){
guard let imgData = self.selectedProfileImage.jpegData(compressionQuality: 2) else { return }
multipartFormData.append(imgData, withName: "file", fileName: "image.jpeg", mimeType: "image/jpeg")
}
},usingThreshold: UInt64.init(),
to: "\(Constants.SERVER_URL)\(Constants.USER_EDIT)",
method: .post,
headers: headers).response{ response in
SVProgressHUD.dismiss()
if(response.data != nil) {
do {
if let jsonData = response.data {
let parsedData = try JSONSerialization.jsonObject(with: jsonData) as! Dictionary<String, AnyObject>
print(parsedData)
}
} catch {
print("error msg")
}
} else {
print("user edit response2 \(response) end")
}
}
以上是我的 AF.upload 代码。数组追加是我有问题的部分。
这是数组附加代码。
//getVisitedCountryCodeList() returns string array
let data = try JSONSerialization.data(withJSONObject: self.getVisitedCountryCodeList(), options: [])
multipartFormData.append(data, withName: "VisitedCountries" )
我也尝试了下面的代码
multipartFormData.append(try JSONEncoder().encode(self.getVisitedCountryCodeList()), withName: key )
下面是服务器得到的,是字符串不是数组
"VisitedCountries"=>"[\"ALG\",\"ARG\"]"
但我需要这样发送
"VisitedCountries"=> ["ALG","ARG"]
在 header 中,将 Content-type
从 multipart/form-data
更改为 application/json
。请求的 Content-type
告诉服务器您发送数据的格式。
let headers: HTTPHeaders = ["Content-type": "application/json"]
终于自己找到了答案,只需要对键值做一个小技巧。下面是代码。
for code in self.getVisitedCountryCodeList(){
if let codeData = code.data(using: .utf8) {
multipartFormData.append(codeData, withName: key+"[]" )
}
}
key+"[]" 或 "VisitedCountries[]" 是这里的技巧,它会自动将其捕获为数组并添加它的下一个值。
在我的例子中,可接受的解决方案仅适用于发送数组中的一个对象。对于不止一项,数组需要作为 "code[]="ALG","ARG""
发送。
接受的答案生成多个数组,每个数组包含一项,例如:"code[]="ALG" "code[]="ARG""
。对我有用的是首先生成所有数组对象的逗号分隔字符串,将其转换为数据并一次性将其附加到 MultiPartFormData。
备选代码:
let key = "countryCodes"
let array = ["ALG", "ARG"]
let arrayString = array.joined(separator: ",")
if let arrayData = arrayString.data(using: .utf8) {
formData.append(arrayData, withName: key+"[]" )
}
我正在尝试使用 Alamofire Swift 库在多部分请求中向服务器发送一个字符串数组,我尝试了几种方法来对数组进行编码,但大多数时候它都是一个字符串。谁能帮我这个。除了数组发送图像上传和其他值可以正常发送到服务器。下面是我的代码。
var parameters: Parameters = [
"UEmail": userObj.email,
"UFirstName": fName,
"ULastName": lName,
"VisitedCountries": getVisitedCountryCodeList() //return String array
]
let headers: HTTPHeaders
headers = ["Content-type": "multipart/form-data"]
AF.upload(multipartFormData: { (multipartFormData) in
for (key, value) in parameters {
if let subArray = value as? NSArray {
do {
if(key == "VisitedCountries"){
let data = try JSONSerialization.data(withJSONObject: self.getVisitedCountryCodeList(), options: [])
multipartFormData.append(data, withName: "VisitedCountries" )
}
} catch {
print("error msg")
}
} else {
multipartFormData.append((value as! NSString).data(using: String.Encoding.utf8.rawValue)!, withName: key )
}
}
if(self.selectedProfileImage != nil){
guard let imgData = self.selectedProfileImage.jpegData(compressionQuality: 2) else { return }
multipartFormData.append(imgData, withName: "file", fileName: "image.jpeg", mimeType: "image/jpeg")
}
},usingThreshold: UInt64.init(),
to: "\(Constants.SERVER_URL)\(Constants.USER_EDIT)",
method: .post,
headers: headers).response{ response in
SVProgressHUD.dismiss()
if(response.data != nil) {
do {
if let jsonData = response.data {
let parsedData = try JSONSerialization.jsonObject(with: jsonData) as! Dictionary<String, AnyObject>
print(parsedData)
}
} catch {
print("error msg")
}
} else {
print("user edit response2 \(response) end")
}
}
以上是我的 AF.upload 代码。数组追加是我有问题的部分。 这是数组附加代码。
//getVisitedCountryCodeList() returns string array
let data = try JSONSerialization.data(withJSONObject: self.getVisitedCountryCodeList(), options: [])
multipartFormData.append(data, withName: "VisitedCountries" )
我也尝试了下面的代码
multipartFormData.append(try JSONEncoder().encode(self.getVisitedCountryCodeList()), withName: key )
下面是服务器得到的,是字符串不是数组
"VisitedCountries"=>"[\"ALG\",\"ARG\"]"
但我需要这样发送
"VisitedCountries"=> ["ALG","ARG"]
在 header 中,将 Content-type
从 multipart/form-data
更改为 application/json
。请求的 Content-type
告诉服务器您发送数据的格式。
let headers: HTTPHeaders = ["Content-type": "application/json"]
终于自己找到了答案,只需要对键值做一个小技巧。下面是代码。
for code in self.getVisitedCountryCodeList(){
if let codeData = code.data(using: .utf8) {
multipartFormData.append(codeData, withName: key+"[]" )
}
}
key+"[]" 或 "VisitedCountries[]" 是这里的技巧,它会自动将其捕获为数组并添加它的下一个值。
在我的例子中,可接受的解决方案仅适用于发送数组中的一个对象。对于不止一项,数组需要作为 "code[]="ALG","ARG""
发送。
接受的答案生成多个数组,每个数组包含一项,例如:"code[]="ALG" "code[]="ARG""
。对我有用的是首先生成所有数组对象的逗号分隔字符串,将其转换为数据并一次性将其附加到 MultiPartFormData。
备选代码:
let key = "countryCodes"
let array = ["ALG", "ARG"]
let arrayString = array.joined(separator: ",")
if let arrayData = arrayString.data(using: .utf8) {
formData.append(arrayData, withName: key+"[]" )
}