Ios Alamofire:如何在多部分表单数据中附加json数组参数?

Ios Alamofire:如何在多部分表单数据中附加json数组参数?,ios,alamofire,multipartform-data,Ios,Alamofire,Multipartform Data,我正在tryna发送一张带有参数的照片,但问题是我想向服务器发送一个JSON数组。Alamofire似乎没有发送数据列表的方法,那么还有什么好的替代方法呢 问题的关键在于: var encodedTags: [Data] = tags.map({ return $0.data(using: .utf8)!}) mpd.append(encodedTags, withName: key) 在此上传呼叫中: let parameters: [String: Any] = [

我正在tryna发送一张带有参数的照片,但问题是我想向服务器发送一个JSON数组。Alamofire似乎没有发送
数据列表的方法,那么还有什么好的替代方法呢

问题的关键在于:

var encodedTags: [Data] = tags.map({ return $0.data(using: .utf8)!})
            mpd.append(encodedTags, withName: key)
在此上传呼叫中:

let parameters: [String: Any] = ["username": "TheCooliest", ..., "tags": ["KoolKid", "TheKooliest", "BetterThanKimK"]    
...

upload(multipartFormData: { (mpd) in
        mpd.append(url, withName: "file", fileName: "weeknd.jpg")
        for (key, value) in parameters {
            if let tags = value as? [String], key == "tags" {
                var encodedTags = tags.map({ return $0.data(using: .utf8)!})
                mpd.append(encodedTags, withName: key)

            }
        }
    }

我也遇到过同样的情况,你必须将数组转换成字符串,然后编码并上传。 在我的例子中,我必须加密数组并发送到服务器,然后服务器解密数组

var encodedTags = tags.map({ return $0})
 //write logic to convert array to string
 mpd.append(encodedTags.data(using: .utf8)!, withName: key)

这是多部分请求的答案,请查看代码。

Alamofire.upload(multipartFormData:{ multipartFormData in
        let firstNameTxt = self.firstNmae.text!.data(using: .utf8)
        multipartFormData.append(firstNameTxt!, withName: "first_name", mimeType: "text/plain")
    },
                     usingThreshold:UInt64.init(), to:AppConstant.GlobalConstants.updateProfile, method:.post, headers:["Authorization": "auth_token"],encodingCompletion: { encodingResult in
                        switch encodingResult {
                        case .success(let upload, _, _):
                            upload.responseJSON { response in
                                debugPrint(response)
                            }
                        case .failure(let encodingError):
                            print(encodingError)
                        }
    })

好的,所以我使用了
JSONSerialization
。它将我的列表转换为我转换为数据的
任何
对象

for (key, value) in parameters {
    if let tags = value as? [String], key == "tags" {

        do {
            let json = try JSONSerialization.data(withJSONObject: tags, options: .prettyPrinted)
            mpd.append(json as Data, withName: key)
        } catch {}

    }

如果您想使用Swift 4实现这一点,可以使用新的JSONECODER。 您可以这样做,使用多部分表单数据上载文件和JSON参数:

let image = UIImage(named: "test")
let png = UIImagePNGRepresentation(image!)!

let arr = ["str1", "str2"]
let jsonArr = try? JSONEncoder().encode(arr)

Alamofire.upload(multipartFormData: { (multiPart) in
    multiPart.append(png, withName: "file", fileName: "aaa.png", mimeType: "image/png")

    if let jsonArr = jsonArr {
        multiPart.append(jsonArr, withName: "pictures")
    }
}, to: URL) { (result) in
}