¿Cómo usar Alamofire 4 SessionManager?

Estaba usando Alamofire 3.4 en Swift 2.3 y necesito actualizar mi código a Swift 3 y Alamofire 4. Estaba usando el Administrador de Alamofire para hacer un POST en una url. Leí la documentation sobre SessionManager y entiendo que la request utiliza el método .GET.

Estaba utilizando Manager .Response () para get la callback de la request, ahora que ha cambiado en SessionManager.

¿Cómo hago un método POST usando SessionManager? ¿Y cómo obtengo la respuesta de la request?

Este es mi código original:

import UIKit import AEXML import Alamofire class Request: NSObject { internal typealias RequestCompletion = (statusCode: Int?, error:NSError?) -> () private var completionBlock: RequestCompletion! var serverTrustPolicy: ServerTrustPolicy! var serverTrustPolicies: [String: ServerTrustPolicy]! var afManager: Manager! func buildBdRequest(ip : String, serviceStr : String, completionBlock:RequestCompletion){ let url = getURL(ip, service: serviceStr) configureAlamoFireSSLPinningWithCertificateData() makeAlamofireRequest(url) self.completionBlock = completionBlock } func makeAlamofireRequest(url : String){ self.afManager.request(.POST, url) .validate(statusCode: 200..<300) .response { request, response, data, error in print("data - > \n \(data.debugDescription) \n") print("response - >\n \(response.debugDescription) \n") print("error - > \n \(error.debugDescription) \n") var statusCode = 0 if response != nil { statusCode = (response?.statusCode)! } self.completionBlock(statusCode: statusCode, error: error) } } private func getURL(ip : String, service: String) -> String{ return ip + service; } func configureAlamoFireSSLPinningWithCertificateData() { self.serverTrustPolicies = [ : // "github.com": self.serverTrustPolicy! ] self.afManager = Manager( configuration: NSURLSessionConfiguration.defaultSessionConfiguration() ) } } 

He migrado tu código a Swift 3 y Alamofire 4 y aquí está el resultado:

 internal typealias RequestCompletion = (Int?, Error?) -> ()? private var completionBlock: RequestCompletion! var afManager : SessionManager! func makeAlamofireRequest(url :String){ let configuration = URLSessionConfiguration.default afManager = Alamofire.SessionManager(configuration: configuration) afManager.request(url, method: .post).validate().responseJSON { response in switch (response.result) { case .success: print("data - > \n \(response.data?.debugDescription) \n") print("response - >\n \(response.response?.debugDescription) \n") var statusCode = 0 if let unwrappedResponse = response.response { let statusCode = unwrappedResponse.statusCode } self.completionBlock(statusCode, nil) break case .failure(let error): print("error - > \n \(error.localizedDescription) \n") let statusCode = response.response?.statusCode self.completionBlock?(statusCode, error) break } } } 

Algunas notas sobre el código:

En Alamofire 4.0 no necesita validar manualmente entre los códigos 200.300. validate() método validate() lo hace automáticamente.

Documentación :

Valida automáticamente el código de estado dentro del range 200 … 299, y que el encabezado Content-Type de la respuesta coincide con el encabezado Accept de la request si se proporciona uno.

Puede usar el parámetro de responseJSON en el método responseJSON . Contiene toda la información que necesita en su código.

Sobre el método de request

open func request(_ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) -> DataRequest

Todos los parameters, excepto la URL, son inicialmente nulos o tienen un valor pnetworkingeterminado. Por lo tanto, no hay problema para agregar parameters o encabezados a su request.

Espero que te ayude

class FV_APIManager: NSObject

{

 //MARK:- POST APIs class func postAPI(_ apiURl:String, parameters:NSDictionary, completionHandler: @escaping (_ Result:AnyObject?, _ Error:NSError?) -> Void) { var strURL:String = FV_API.appBaseURL if((apiURl as NSString).length > 0) { strURL = strURL + "/" + apiURl } _ = ["Content-Type": "application/x-www-form-urlencoded"] print("URL -\(strURL),parameters - \(parameters)") let api = Alamofire.request(strURL,method: .post, parameters: parameters as? [String : AnyObject], encoding: URLEncoding.default) // ParameterEncoding.URL api.responseJSON { response -> Void in print(response) if let JSON = response.result.value { print("JSON: \(JSON)") completionHandler(JSON as AnyObject?, nil) } else if let ERROR = response.result.error { print("Error: \(ERROR)") completionHandler(nil, ERROR as NSError?) } else { completionHandler(nil, NSError(domain: "error", code: 117, userInfo: nil)) } } } 

Espero que esto te sea útil.