ios - 如何使用 Alamofire 在多部分表单数据中附加数组?
问题描述
我正在使用 Alamofire 上传带有多部分表单数据的图像,但是在我将数组作为参数传递时遇到了一些问题。
根据要求,我需要将所有数据传递给信件。这就是我正在做的事情。
let data = try! JSONSerialization.data(withJSONObject: arrSelectedRecipientsID, options: .prettyPrinted)
let jsonString = String(data: data, encoding: .utf8)!
let paramArr : [String : Any] = [
"message" : txtvwMessage.text!,
"status": "draft",
"recipient_ids": jsonString
]
let parameter : [String : Any] = ["letter" : paramArr]
let accesstoken = Utilities.retriveValueFromDefault(forKey: UDKey.kUserAuthentication_Token) as String
let client = Utilities.retriveValueFromDefault(forKey: UDKey.kUserClient) as String
let uid = Utilities.retriveValueFromDefault(forKey: UDKey.kUserUID) as String
let headersInfo : HTTPHeaders = [ "Content-Type" : "multipart/form-data",
"Accept" : "application/json",
"access-token" : accesstoken,
"client" : client,
"uid" : uid
]
fileUploadWithParameter(Constant.ServerAPI.kPostLetters, images: letterImage, header: headersInfo, parameters: parameter, success: { (response) in
print(response)
}) { (progress) in
}
这是 Alamofire 请求方法。
func fileUploadWithParameter(_ url: String,images:NSMutableArray,header : [String : String], parameters: [String:Any], success:@escaping (NSDictionary)->(),progressHandler:@escaping(_ progress: Double)->Void) {
Alamofire.upload(multipartFormData: { multipartFormData in
for i in 0..<images.count {
let rotatedImage = images[i] as! UIImage
if let imgData = UIImageJPEGRepresentation(rotatedImage, 0.8) {
multipartFormData.append(imgData, withName: "letter[photos]",fileName: "0\(i).jpg", mimeType: "image/jpg")
}
}
for (key, value) in parameters {
//multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key )
let paramsData:Data = NSKeyedArchiver.archivedData(withRootObject: value)
multipartFormData.append(paramsData, withName: key)
}
}, to: url,
method:.post,
headers:header) { (result) in
print("\n\n\nRequest URL :- \(url)\nParameters :- \(parameters)")
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
if response.error != nil {
print("Error :- \((response.error?.localizedDescription)!)\n\n\n")
}
if let jsonDict = response.result.value as? NSDictionary {
print("Response :- \(jsonDict)\n\n\n")
} else {
print("Error :- \(Constant.ErrorMessage.kCommanError)\n\n\n")
}
}
case .failure(let encodingError):
print("Error :- \(encodingError.localizedDescription)\n\n\n")
}
}
}
邮递员工作得很好,所以有人可以帮我解决我做错的地方。
API 预期正确的 json 应该是
{
"letter":
{
"message": "Type your message here...!!!",
"recipient_ids": [183, 184],
"status": "draft"
}
}
API 在 ruby on rails 中,它说我正在发送字符串。请帮我找出问题所在。
解决方案
只需要更改给定的代码行:
for (key, value) in parameters {
if key == "letter" {
let arrData = try! JSONSerialization.data(withJSONObject: value, options: .prettyPrinted)
multipartFormData.append(arrData, withName: key as String)
}
else {
multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
}
}
休息将是一样的。
您的方法以更新的形式:
func fileUploadWithParameter(_ url: String,images:NSMutableArray,header : [String : String], parameters: [String:Any], success:@escaping (NSDictionary)->(),progressHandler:@escaping(_ progress: Double)->Void) {
Alamofire.upload(multipartFormData: { multipartFormData in
for i in 0..<images.count {
let rotatedImage = images[i] as! UIImage
if let imgData = UIImageJPEGRepresentation(rotatedImage, 0.8) {
multipartFormData.append(imgData, withName: "letter[photos]",fileName: "0\(i).jpg", mimeType: "image/jpg")
}
}
for (key, value) in parameters {
//multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key )
let paramsData:Data = NSKeyedArchiver.archivedData(withRootObject: value)
multipartFormData.append(paramsData, withName: key)
}
for (key, value) in parameters {
if key == "letter" {
let arrData = try! JSONSerialization.data(withJSONObject: value, options: .prettyPrinted)
multipartFormData.append(arrData, withName: key as String)
}
else {
multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
}
}
}, to: url,
method:.post,
headers:header) { (result) in
print("\n\n\nRequest URL :- \(url)\nParameters :- \(parameters)")
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
if response.error != nil {
print("Error :- \((response.error?.localizedDescription)!)\n\n\n")
}
if let jsonDict = response.result.value as? NSDictionary {
print("Response :- \(jsonDict)\n\n\n")
} else {
//print("Error :- \(Constant.ErrorMessage.kCommanError)\n\n\n")
print("Errfdc")
}
}
case .failure(let encodingError):
print("Error :- \(encodingError.localizedDescription)\n\n\n")
}
}
}
推荐阅读
- python - 使用漂亮的汤从表格中的行中的单元格获取值显示 {{row.value}} 作为结果
- build - 使用 helm 重建项目
- python - 在 Python 中更改堆积条形图图例
- java - 如何在android studio中解决“清单合并失败:”
- docker - 如何使用 docker 镜像运行 docker-compose?
- javascript - 带有 CKeditor 4.x 验证的 jQuery 表单验证器不起作用
- reactjs - 部署到 GitHub Pages 的 React 应用程序给出“未找到站点”
- javascript - 如何确保回调下面的代码始终在回调完成后运行
- arrays - 在给定范围内具有频率 k 的总数
- java - 当我运行以下命令时出现问题“Oracle Java (JDK) 8 Installer PPA (DISCONTINUED)” - $sudo add-apt-repository ppa:webupd8team/java