Ios Swift多部分/表单数据上传,将字符串数组追加到正文中(问题:数组作为字符串传递到服务器)

Ios Swift多部分/表单数据上传,将字符串数组追加到正文中(问题:数组作为字符串传递到服务器),ios,arrays,json,swift,multipartform-data,Ios,Arrays,Json,Swift,Multipartform Data,我试图使用Alamofire Swift库在一个多部分请求中向服务器发送一个字符串数组,我尝试了几种方法对数组进行编码,但大多数情况下它都是字符串。有人能帮我吗。除了发送图像上传的数组和其他值,服务器可以正常工作。下面是我的代码 var parameters: Parameters = [ "UEmail": userObj.email, "UFirstName": fName, "ULastName": lName, "Visit

我试图使用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")
        }
    }
我也尝试了下面的代码

multipartFormData.append(try JSONEncoder().encode(self.getVisitedCountryCodeList()), withName: key )
下面是服务器获取的内容,它是字符串而不是数组

"VisitedCountries"=>"[\"ALG\",\"ARG\"]"
但我需要像这样发送

"VisitedCountries"=> ["ALG","ARG"]
在标题中,将内容类型从多部分/表单数据更改为application/json。请求的内容类型告诉服务器您发送数据的格式

let headers: HTTPHeaders = ["Content-type": "application/json"]

终于自己找到了答案,只需用键值做一个小把戏。下面是代码

for code in self.getVisitedCountryCodeList(){
    if let codeData = code.data(using: .utf8) {
        multipartFormData.append(codeData, withName: key+"[]" )
    }
}

键+[]或VisitedCountries[]是这里的诀窍,它会自动将其作为数组捕获,并向其中添加下一个值。

在我的情况下,接受的解决方案仅适用于发送数组中的一个对象。对于多个项目,需要将数组作为代码[]=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+"[]" )
        }

它是“VisitedCountries”键下的一组字符串。您希望的格式是什么?VisitedCountries=>[ALG,ARG]。我希望这样。特别是没有外部[]引号。p、 s-im不是后端dev@losiowatti,我也需要上传一张图片。刚刚试过,还是一样:D@LahiruPinto检查压缩质量-表示为0.0到1.0之间的值
        let key = "countryCodes"
        let array = ["ALG", "ARG"]
        let arrayString = array.joined(separator: ",")

        if let arrayData = arrayString.data(using: .utf8) {
            formData.append(arrayData, withName: key+"[]" )
        }