阿拉莫菲尔多部分的要求

我是新的快速编程。 我正在尝试通过alamofire做多部分请求。问题是我的参数中的一个值是对象的数组。 我的问题是如何将对象数组追加到Multipart请求。 这是我的参数。

let parameters = [ "originguid":"63d6sd5", "signees":[Signess], //Here is issue "signees"is an array of objects "customer":"yes" ] as [String : Any] 

这是我的要求

 Alamofire.upload( .POST, URLString: myUrl, multipartFormData: { multipartFormData in if let img = self.imagePicked { multipartFormData.append(UIImageJPEGRepresentation(img, 0.2)!, withName: "fileset",fileName: "file.png", mimeType: "image/jpg") } if let file = self.filePicked{ let fileData = try! Data(contentsOf: file) multipartFormData.append(fileData as Data, withName:"test.pdf", mimeType:"application/pdf") } for (key, value) in parameters { if key == "signees"{ multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) } else{ multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) } } }, ... ) 

将签名附加到多部分请求时,应用程序崩溃。 这是我在参数中使用的对象。

 class Signee: NSObject, NSCoding { var name = "" var email = "" var phoneNo = "" func encode(with aCoder: NSCoder) { aCoder.encode(name, forKey: "name") aCoder.encode(email, forKey: "email") aCoder.encode(phoneNo, forKey: "phoneNo") } init(name: String, email: String, phone: String) { self.name = name self.email = email self.phoneNo = phone } required convenience init(coder aDecoder: NSCoder) { let name = aDecoder.decodeObject(forKey: "name") as! String let email = aDecoder.decodeObject(forKey: "email") as! String let phoneNo = aDecoder.decodeObject(forKey: "phoneNo") as! String self.init(name: name, email: email, phone: phoneNo) }} 

请帮忙。 在此先感谢,我浪费了两天时间尝试不同的事情。

在你的项目中添加这个扩展

 //NSObject Array Extension extension Array where Element: NSObject { func toJson() -> [[String: Any]]{ var passDict: [[String: Any]] = [] for element in self { passDict.append(element.toDict()) } return passDict } } //NSObject convert in to [String: Any] extension NSObject { @objc func toDict() -> [String: Any] { var dict: [String: Any] = [:] for chiled in self.property() { dict[chiled.label!] = chiled.value } return dict } // NSObject all varible list func property() -> Mirror.Children { return Mirror(reflecting: self).children } } 

并将NSObject转换为[String:Any]

 let parameters: [String : Any] = [ "originguid":"63d6sd5", "signees":[Signess].toJson(), "customer":"yes" ] 

添加参数

  if key == "signees"{ do { let jsonData = try JSONSerialization.data(withJSONObject: value, options: [.prettyPrinted]) multipartFormData.append(jsonData, withName: key) } catch let parseError { print("json serialization error: \(parseError)") } } else{ multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) } 

与Alamofire合并

 let headerDic: HTTPHeaders = [ "YOUR_HEADER_DIC" ] let paramDic: Parameters = [ "YOUR_PARAMETER_DIC" ] Alamofire.upload(multipartFormData: { (MultipartFormData) in MultipartFormData.append("YOUR_IMAGEDATA", withName: "YOUR_IMAGE_PARAMETER_NAME", fileName: "YOUR_IMAGENAME", mimeType: "image/jpeg") for (key, value) in paramDic { MultipartFormData.append(((value as AnyObject).data(using: String.Encoding.utf8.rawValue))!, withName: key) } }, to: "YOUR_WEBSERVICE_NAME", method: .post, headers: headerDic) { (result) in switch result { case .success(let upload, _, _): upload.responseJSON { response in if let value = response.result.value { let responseDic: NSDictionary = value as! NSDictionary "YOUR_WEB_RESPONSE_SUCCESS_MESSEGE" } else { "YOUR_WEB_RESPONSE_ERROR_MESSEGE" } } } case .failure(let encodingError): var messege: String = String() if encodingError.localizedDescription.characters.count <= 0 { messege = "Please check your Internet Conneciton!" } else { messege = encodingError.localizedDescription } print("Error Messege:\(messege)") } }