swift afnetworking alamofire

alamofire swift 4 pod



Cómo usar Alamofire con encabezados personalizados. (10)

Estoy empezando a echar un vistazo a la nueva y maravillosa biblioteca de redes de Alamofire swift de Mattt y no estoy seguro de cómo se usaría con encabezados personalizados.

El código que estoy intentando convertir de AFNetworking a Alamofire es el siguiente:

let request = NSMutableURLRequest(URL: url) request.setValue(authorizationToken, forHTTPHeaderField:"Authorization")


Como no me gusta configurar estas cosas globalmente (y algunas veces las envío, a veces no), escribí un método de envoltorio para configurar los encabezados con cada llamada.

import Alamofire public class Service: NSObject { private class func request(method: Alamofire.Method, URLString: URLStringConvertible, parameters: [String : AnyObject]?, encoding: ParameterEncoding = .URL, headers: [String: String]? = nil) -> Request { let (request, error) = encoding.encode(NSURLRequest(URL: NSURL(string: URLString.URLString)!), parameters: parameters) let mutableURLRequest = request as! NSMutableURLRequest mutableURLRequest.HTTPMethod = method.rawValue if let heads = headers { for (field, value) in heads { mutableURLRequest.setValue(value, forHTTPHeaderField: field) } } return Alamofire.request(mutableURLRequest) } }

Puede ser llamado como sigue ...

Service.request(.POST, URLString: "http://httpbin.org/post", parameters: ["example-param": "example-param-value"], encoding: .JSON, headers: ["example-header-field": "example-value"])/*.whatever you want to do with it*/

Ciertamente, se podría limpiar con una comprobación de errores, pero esto debería darle una idea de ello. Todo está basado en Alamofire 1.2.


En este momento, Swift 3.0, Xcode 8.x, Alamofire 4.x:

Puede utilizar el encabezado personalizado de la siguiente manera:

let headers: HTTPHeaders = [ "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==", "Accept": "application/json" ] Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in debugPrint(response) }

Para reference


He creado un método de encabezados estáticos en una clase APIManager separada.

import Foundation import Alamofire class APIManager { class func headers() -> HTTPHeaders { var headers: HTTPHeaders = [ "Content-Type": "application/json", "Accept": "application/json" ] if let authToken = UserDefaults.standard.string(forKey: "auth_token") { headers["Authorization"] = "Token" + " " + authToken } return headers } }

Y lo uso en peticiones:

Alamofire.request(urlString, method: .get, headers:APIManager.headers())


La configuración del código siguiente solo funcionará en iOS 8 y superior.

Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = headers

A continuación se muestra el código completo que funciona para iOS 7 y iOS 8

let URL = NSURL(string: request.url!) var mutableURLRequest = NSMutableURLRequest(URL: URL!) mutableURLRequest.HTTPMethod = Alamofire.Method.GET.rawValue // Adding headers var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:] let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.HTTPAdditionalHeaders = defaultHeaders // Adding parameters let manager = Alamofire.Manager(configuration: configuration) let urlReq = ParameterEncoding.URL.encode(mutableURLRequest, parameters: request.params).0 aReq = manager.request(urlReq) aReq!.responseJSON { (req, response, JSON, error) in }

Más información: https://github.com/Alamofire/Alamofire/issues/111


Para los encabezados que cambian de solicitud a solicitud, puede pasarlos directamente al método de solicitud. De la documentación:

Agregar un encabezado HTTP personalizado a una Solicitud se admite directamente en el método de solicitud global. Esto facilita la asignación de encabezados HTTP a una solicitud que puede cambiar constantemente.

Y el ejemplo dado:

let headers = [ "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==", "Content-Type": "application/x-www-form-urlencoded" ] Alamofire.request(.GET, "https://httpbin.org/get", headers: headers) .responseJSON { response in debugPrint(response) }

Sin embargo, si desea establecer encabezados que no cambien, se recomienda que lo haga en el objeto NSURLConfiguration, como otros han mencionado aquí.


Puede pasar un objeto NSMutableURLRequest directamente a Alamofire, ya que tiene una extensión para NSMutableURLRequest que adopta URLRequestConvertible . Por lo tanto, no es necesario crear su propia clase para simplemente agregar un encabezado de Autorización. Es tan simple como esto:

let request = NSMutableURLRequest(URL: url) request.setValue(authorizationToken, forHTTPHeaderField:"Authorization") Alamofire.request(request) .responseJSON { (_, _, JSON, error) in }


Según la documentación oficial, no se recomienda modificar la configuración de la sesión:

Esto no se recomienda para los encabezados de Autorización o Tipo de Contenido. En su lugar, use URLRequestConvertible y ParameterEncoding, respectivamente.

Por lo tanto, un ejemplo de uso de URLRequestConvertible para la autorización sería:

enum Router: URLRequestConvertible { static let baseUrlString = "some url string" case Get(query: String) var URLRequest: NSMutableURLRequest { let (path: String, parameters: [String: AnyObject]?) = { switch self { case .Get(let query): return ("/get", ["q": query]) } }() let URL = NSURL(string: Router.baseUrlString)! let URLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path)) // set header fields URLRequest.setValue("a", forHTTPHeaderField: "Authorization") let encoding = Alamofire.ParameterEncoding.URL return encoding.encode(URLRequest, parameters: parameters).0 } }

y cuando quieras hacer una petición:

Manager.sharedInstance.request(Router.Get(query: "test"))

Más información sobre URLRequestConvertible: https://github.com/Alamofire/Alamofire#urlrequestconvertible

Respuesta antigua

A partir de Alamofire v1.0 Pers la respuesta ya no funciona. En la nueva versión, se deben agregar encabezados adicionales a la propiedad NSURLSessionConfiguration de NSURLSessionConfiguration

Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = ["Authorization": authorizationToken]

Más información aquí: https://github.com/Alamofire/Alamofire/issues/111


Alamofire 4.x, XCode 9.1, Swift 4.x

Cuando los Encabezados causan problemas al enviarlo en la solicitud, necesitamos codificar el parámetro, para esto hacemos JSONEncoding.prettyPrinted o JSONEncoding.default como:

let url = "http:/your.url.string/" let parameter = ["Username":"name", "Password":"123"] let headers = ["Content-Type" : "application/json"] Alamofire.request(url, method : .post, parameters : parameter, encoding : JSONEncoding.default , headers : headers).responseData { dataResponse in print(dataResponse.request as Any) // your request print(dataResponse.response as Any) // your response }


NOTA : esto fue antes de la 1.0. Ya no funciona , mira la respuesta aceptada en su lugar.

Utiliza la propiedad defaultHeaders en el administrador de singleton para agregar encabezados, como este:

Alamofire.Manager.sharedInstance.defaultHeaders.updateValue(authorizationToken, forKey: "Authorization")

Al menos funciona para mí. :)


let aManager = Manager.sharedInstance aManager.session.configuration.HTTPAdditionalHeaders = [ "Authorization": "Some authentication Token here" ] let URL = "some url string" request(.GET, URL, encoding: .JSON) .responseJSON { (request, response, data, error) -> Void in if(error != nil) { if let delegate = self.delegate { delegate.connectionDidFinishedErrorResponceForAction!(1, andWithResponse: nil) } println("/(error!.localizedDescription)") } else { if let delegate = self.delegate { delegate.connectionDidFinishedForAction!(1, andWithResponse: nil) } println("req:/(request) /n res:/(response) /n json:/(data!) /n /(error) ") } }