Append Nested Objects in Parameters of multi-form Swift using Alamofire

*爱你&永不变心* 提交于 2020-12-30 04:49:25

问题


I am uploading multiple images as well as JSON data using "Content-type": "multipart/form-data" my issue is, I have nested objects to pass to the parameters I was looking for a solution, and what I find is nested data with an array of String or Int, not another custom object (I was struggling with it for so long)

struct Car: Codable{
    var id :Int,
    var name:String,
    var address:String,
    var new:Bool
    var users:[User]
}

struct User: Codable{
    var id :Int,
    var name:String,
    var address:String,
    var age:Int
}

I wanted to convert the data to do a dictionary to use it as parameters

func addNewCae(newCar:Car, images:[UIImage]){

    let encoder = JSONEncoder()
    let jsonData = try! encoder.encode(newCar)


    let test = convertStringToDictionary(text: jsonData)
    print(test)


    let headers: HTTPHeaders
    headers = ["Content-type": "multipart/form-data",
                         "Content-Disposition" : "form-data"]
    AF.upload(multipartFormData: { multipartFormData in
        for imageData in images {
            guard let imgData = imageData.pngData() else { return }
            multipartFormData.append(imgData , withName: "images[]", fileName: "image.jpeg", mimeType: "image/jpeg")
        }

        for (key, value) in self.convertStringToDictionary(text: jsonData)! {
            multipartFormData.append("\(value)".data(using: .utf8)!, withName: key)

        }


    },to: "\(url)", usingThreshold: UInt64.init(),
      method: .post,
      headers: headers).responseString{ response in
        switch response.result {
        case .success(let value):
            print(value)
            break
        case .failure(let error):
            print(error)
        }
    }

}

func convertStringToDictionary(data: Data) -> [String:AnyObject]? {
    do {
        let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject]
        return json
    } catch {
        print("Something went wrong")
    }
    return nil
}

As a request of my code: all the car fields are registered in the database except the users' field (in reality, I have more fields than that) Why the users' field is not added to the parameters?
Any idea?

The users filed normally be of type [[String: AnyObject]] in the parameters here is the data after I convert it to a dictionary

Optional(["name":"whatever" , "address": "here", "users": <__NSArrayM 0x6000008e4f90>(
{
    "name" = "hello";
    "address" = "there";
    "age" = 20;
},
{
  "name" = "hi";
    "address" = "location";
    "age" = 25;
}
)
, "new": 0])

hope am clear enough, I can add any further code or information if needed to be clearer Thanks

Update

I did the encoding manually so now I have a correct dictionary format of type [String: AnyObject] but one of them is nested :

["name":"whatever" , "address": "here", "users": [
    [
        "name" = "hello";
        "address" = "there";
        "age" = 20;
    ],
    [
      "name" = "hi";
        "address" = "location";
        "age" = 25;
    ]
    ]
    , "new": 0]

BUT, still, the "users" field is not able to be read, I think because the parameters don't support that kind of type?
Anyone have any other idea how to deal with these nested objects?

来源:https://stackoverflow.com/questions/63627077/append-nested-objects-in-parameters-of-multi-form-swift-using-alamofire

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!