Быстрая выгрузка multipart / form-data с добавлением String Array к телу (проблема: Array переходит как String to Server) - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь отправить массив строк на сервер в многокомпонентном запросе с использованием библиотеки 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"]

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Наконец-то нашел ответ самостоятельно, просто нужно сделать небольшой трюк со значением ключа.ниже приведен код.

for code in self.getVisitedCountryCodeList(){
    multipartFormData.append((code as NSString).data(using: String.Encoding.utf8.rawValue)!, withName: key+"[]" )
}

key + "[]" или "VisitedCountries []" - это трюк, который автоматически захватывает его как массив и добавляетследующие значения к нему.

0 голосов
/ 18 мая 2019

В заголовке изменить Content-type на application/json с multipart/form-data. Content-type запроса сообщает серверу, в каком формате вы отправляете данные.

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