Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send total model object as a parameter of Alamofire post method in Swift3?

I have a model class like this

class Example() {
  var name:String?
  var age:String?
  var marks:String? 
}

I'm adding data to that model class

let example = Example()
example.name = "ABC"
example.age = "10"
example.marks = "10" 

After that I converted to JSON then I posted

Alamofire.request(URL, method:.post, parameters: example)

Alamofire not accepting parameters only its accepting like parameters = ["":"","",""]-->key value based, so I tried to convert model to JSON, JSON to dictionary, even though not accepting its showing like parameters problem. Exactly I need total model object need to send as a parameter of post method in Alamofire like this:

let example = Example()
Alamofire.request(URL, method:.post, parameters: example) 
like image 306
Tirupatirao Avatar asked Apr 27 '17 05:04

Tirupatirao


2 Answers

Since the Alamofire API is only accepting dictionaries, create a dictionary yourself!

Add a method in the model class called toJSON:

func toJSON() -> [String: Any] {
    return [
        "name": name as Any,
        "age": age as Any,
        "marks": marks as Any
    ]
}

Then call this method when calling request:

Alamofire.request(URL, 
    method:.put, 
    parameters:example.toJSON(), 
    encoding:JSONEncoding.default, 
    headers :Defines.Api.Headers )

Alternatively, use SwiftyJSON:

func toJSON() -> JSON {
    return [
        "name": name as Any,
        "age": age as Any,
        "marks": marks as Any
    ]
}

Usage:

Alamofire.request(URL, 
    method:.put, 
    parameters:example.toJSON().dictionaryObject, 
    encoding:JSONEncoding.default, 
    headers :Defines.Api.Headers )
like image 132
Sweeper Avatar answered Nov 04 '22 00:11

Sweeper


The best way so far is to make your model conform to Encodable then convert you model into json Data like so

let data = try! JSONEncoder.init().encode(example)

then use SwiftyJSON to convert it back to dictionary

let json = try! JSON.init(data: data)
let dictionary = json.dictionaryObject

as Rob said you can also use JSONSerialization if you are not already using SwiftyJSON

let dictionary = try! JSONSerialization.jsonObject(with: data) as! [String: Any]

Then use the dictionary in your parameters

Also Alamofire now supports Encodable parameters with

let urlRequest = JSONParameterEncoder.init().encode(example, into: urlRequest)
like image 31
Amr Mohamed Avatar answered Nov 03 '22 22:11

Amr Mohamed