Search code examples
iosswift3alamofiremultipartform-dataswifty-json

Creating JSON data using SwiftyJson for MultipartFormData request in Alamofire 4


I need to send a MultipartFormData .Post Request using Alamofire 4.

The JSON and File data needs to be sent.

I am having a hard time converting SwiftyJson object to type Data object.

SwiftyJSON looks like this:

var json: JSON = JSON([ "Name" : "Ben", "UserID" : 2, "Username" : "benji"])

Alamofire 4 request looks like this

service.upload(multipartFormData: { (MultipartFormData) in
            MultipartFormData.append(userData, withName: "userInfo")
            MultipartFormData.append(fileUrl, withName: "File")    
            }, to: url) { (encodingResult) in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseJSON { response in
                        debugPrint(response)
                    }
                case .failure(let encodingError):
                    print(encodingError)
                }
            }

My Question is how do I convert SwiftyJson Object to Type Data so I can append it to mutlipartformdata? I have tried following but they do not seem to work and I can not find a solution online:

json.rawData()
json.rawString?.data(using: String.Encoding.utf8)

Solution

  • I found out there is/was a bug with json.rawString in SwiftyJSON stated in link below:

    https://github.com/SwiftyJSON/SwiftyJSON/issues/645

    Making fields "implicitly unwrapped" will fix this issue:

        var data = JSON([
                    "name": _name.text,
                    "code": _code.text,
                    "iconId": _id])
    
    //data.rawString() will return nil
    
        var data = JSON([
                    "name": _name.text!,
                    "code": _code.text!,
                    "iconId": _id])
    //data.rawString() will return correct result
    

    After this I can simply use it as follows:

    self.service.upload(multipartFormData: { (MultipartFormData) in
                MultipartFormData.append((data.rawString()?.data(using: String.Encoding.utf8))!, withName: "trackerInfo")
                MultipartFormData.append(fileUrl, withName: "File") 
            }, to: url) { (encodingResult) in
                switch encodingResult {
                case .success:
                    print(encodingResult)
                case .failure(let encodingError):
                    print(encodingError)
                }
            }