Размещать массив объектов с помощью Alamofire и SwiftyJSON - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть массив словарей, которые я пытаюсь опубликовать в Alamofire с помощью SwiftyJSON.

API настроен на:

[
    {
        "imageUrl": "someimage3.jpg"
    },
    {
        "imageUrl": "someimage4.jpg"
    }
]

Мой массив с объектами изображенийкогда распечатка выглядит так с ключом imageUrl и именем изображения для значения.

uploadedFiles = [
    [imageUrl: "someimage.jpg"],
    [imageUrl: "someimage2.jpg"]
]

Я пытаюсь преобразовать массив словарей в формат, необходимый для тела.Я не совсем уверен, как заставить их быть [String: AnyObject]

var body: [String: AnyObject] = [:]
let paramsJSON = JSON(uploadedFiles)
body = paramsJSON

alamofire post

Alamofire.request("\(BASE_URL)mainimages/\(someid)", method: .post, parameters: body, encoding: JSONEncoding.default, headers: header).responseString { (response) in
        if response.result.error == nil {
            let status = response.response?.statusCode
            completion(true, status)
        } else {
            completion(false, nil)
            debugPrint(response.result.error as Any)
        }
    }

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018

Вы можете добиться с помощью этого метода, он работал для меня.

let payload = [["eventName": "Notifications","body":["version": "1.0","latitude": lat,"longitude":lon]]] as [[String : AnyObject]]

trackEventRequest(requestParams: payload, urlString: "https://xyz/youyURL")





func trackEventRequest(requestParams: [[String: AnyObject]], urlString: String) {

        let url = URL(string: urlString)
        var request = URLRequest(url: url!)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "POST"
        request.httpBody = try! JSONSerialization.data(withJSONObject: requestParams, options: [])

        Alamofire.request(request).responseJSON { (response) in
            switch response.result {
            case .success:
                print(response.result.value)
                break
            case .failure:
                print(response.error)
                break
            }
        }
    }
0 голосов
/ 26 апреля 2018

Вы можете сделать это, создав ручной запрос и вызвав Alamofire.request, как показано ниже

var request = URLRequest(url: .......))
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Accept")

//parameter array

let uploadedFiles = [
   [imageUrl: "someimage.jpg"],
   [imageUrl: "someimage2.jpg"]
]

request.httpBody = try! JSONSerialization.data(withJSONObject: uploadedFiles)

Alamofire.request(request).responseJSON { response in

    switch (response.result) {
    case .success:

        //success code here

    case .failure(let error):

        //failure code here
    }
}

Если вы можете легко изменить формат на стороне сервера, игнорируйте вышеуказанное решение и измените его как словарь

[ "list_key" : [
       [imageUrl: "someimage.jpg"],
       [imageUrl: "someimage2.jpg"]
    ] 
 ]
0 голосов
/ 04 мая 2018

Я переформатировал свой API, как предложил Мани, чтобы упростить предоставление Alamofire того, что ему нужно.Теперь он ищет это:

{
    "allImages" : [
        {
            "imageUrl": "someimage5.jpg"
        },
        {
            "imageUrl": "someimage6.jpg"
        }
    ]
}

Мне также пришлось переформатировать мой массив, как показано ниже, чтобы избежать ошибок JSON.

var newUploadFilesArray = [AnyObject]()
    for item in uploadedFiles {
        let singleImageDict = ["imageUrl" : item.imageUrl]
        newUploadFilesArray.append(singleImageDict as AnyObject)
    }

    let body: [String: AnyObject] = [
        "allImages": newUploadFilesArray as AnyObject
    ]

    Alamofire.request("\(BASE_URL)mainimages/\(mainId)", method: .post, parameters: body, encoding: JSONEncoding.default, headers: header).responseString { (response) in
        if response.result.error == nil {
            let status = response.response?.statusCode
            completion(true, status)
        } else {
            completion(false, nil)
            debugPrint(response.result.error as Any)
        }
    }
0 голосов
/ 26 апреля 2018

Похоже, что API использует JSON с массивом в качестве верхнего уровня, а не словарем, поэтому преобразование массива в словарь некорректно.

Просто передайте массив в!

SwiftyJSON JSON соответствует ExpressibleByArrayLiteral, так что вы можете просто использовать литерал массива:

let paramsJSON: JSON = [
    ["imageUrl": "someimage.jpg"],
    ["imageUrl": "someimage2.jpg"]
]

EDIT: я только что понял, что метод request Alamofire принимает только [String: AnyObject].Это означает, что вам нужно выполнить собственную кодировку параметров, показанную здесь .

В качестве альтернативы, создайте свой собственный URLRequest, как показано в этом посте :

var request = URLRequest(url: someURL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = paramsJSON.rawData()
Alamofire.request(request)
...