ios - example - pod alamofire swift 4
¿Cómo usar Alamofire 4 SessionManager? (2)
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 documentación sobre SessionManager y entiendo que la solicitud utiliza el método .GET.
Estaba usando Manager .Response () para obtener la devolución de llamada de la solicitud, ahora eso se ha modificado en SessionManager.
¿Cómo hago un método POST usando SessionManager? ¿Y cómo obtengo la respuesta de la solicitud?
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 su 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 es necesario validar manualmente entre los códigos 200..300. validate()
método validate()
hazlo automáticamente.
Valida automáticamente el código de estado dentro del rango 200 ... 299, y que el encabezado Content-Type de la respuesta coincida con el encabezado Aceptar de la solicitud, si se proporciona uno.
Puede utilizar 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 parámetros, excepto la URL, son inicialmente nulos o tienen un valor predeterminado. Por lo tanto, no es problema agregar parámetros o encabezados a su solicitud.
Espero te ayude
clase 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.