cómo utilizar Alamofire con los encabezados personalizados

Estoy empezando a echar un vistazo a Mattt maravilloso nuevo Alamofire swift biblioteca de red y no estoy muy seguro de cómo se podría utilizar con cabeceras personalizadas.

El código que estoy tratando de convertir de AFNetworking a Alamofire es este:

let request = NSMutableURLRequest(URL: url)
request.setValue(authorizationToken, forHTTPHeaderField:"Authorization")
  • defaultHeaders es un mutable diccionario ([String: String]) de los encabezados. Creo que debe ser capaz de agregar encabezados a que.
InformationsquelleAutor pixbroker | 2014-08-05

10 Kommentare

  1. 48

    De acuerdo a la documentación oficial, la modificación de la configuración de la sesión no se recomienda:

    Esto no es recomendable para la Autorización o encabezados de Tipo de Contenido.
    En su lugar, utilice URLRequestConvertible y ParameterEncoding,
    respectivamente.

    Así que 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 usted quiere hacer una petición:

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

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

    Respuesta Anterior

    Como de Alamofire v1.0 Pers respuesta ya no funciona. En la nueva versión encabezados adicionales deben ser añadidos a la HTTPAdditionalHeaders propiedad de NSURLSessionConfiguration

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

    Más info aquí: https://github.com/Alamofire/Alamofire/issues/111

    • Gracias por señalarlo!
    • Esto funciona también para iOS 7? Al parecer, para mí no está funcionando en iOS 7, solo en iOS 8.
    • trabajó muy bien en iOS 7 cuando lo probé. Es posible que los cambios más recientes de Swift rompió algo. Estoy en un poco de una contracción del tiempo, así que estoy no se puede comprobar.
    • ninguna noticia respecto a esto?
    • He actualizado la respuesta
    • envolver esta en una enumeración parece peculiar de la me – puede usted explicar su justificación para que, por favor? EDIT: Ah no importa, lo tengo 🙂
    • se puede especificar qué versión de Alamofire que se están refiriendo ?

  2. 35

    Para los encabezados de que el cambio de una petición a otra, se pueden pasar directamente al método de solicitud. De el docs:

    La adición de un encabezado HTTP personalizado a una Solicitud esté apoyada directamente en el global método de solicitud. Esto hace que sea fácil de colocar encabezados HTTP para la Solicitud de que se pueden 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 configurar los encabezados de que no cambie, es recomendable que lo haga en el NSURLConfiguration objeto, como otros han mencionado aquí.

  3. 28

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

    Puede utilizar 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 referencia

    • en este donde su paso de parámetros?
  4. 5

    Porque no me gusta la configuración de estas cosas en el mundo (y a veces me los envía, a veces no), me escribió un contenedor método para establecer 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*/

    Sin duda puede ser limpiado con algunos comprobación de errores, pero esto debe darle el quid de la cuestión. Todo se basa en la Alamofire 1.2.

  5. 5

    NOTA: esto fue antes de la 1.0. Ya no funciona, mire la aceptó responder en su lugar.


    Utilizar el defaultHeaders de la propiedad en el Administrador de singleton para agregar encabezados, como este:

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

    Al menos a mí me funciona. 🙂

    • Funciona muy bien, gracias!
  6. 3

    Configuración a continuación el código sólo funciona en iOS 8 y superior.

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

    A continuación está 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 info : GitHub – Alamofire Problemas

  7. 3

    Se puede pasar un NSMutableURLRequest objeto directamente a Alamofire, ya que cuenta con una extensión de NSMutableURLRequest que adopta URLRequestConvertible. Así que no hay necesidad de crear su propia clase a añadir un encabezado de Autorización. Es tan sencillo como esto:

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

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

    Cuando Encabezados causa problema, mientras que el envío de la solicitud, entonces tenemos que codificar parámetro, para esto hacemos JSONEncoding.prettyPrinted o JSONEncoding.por defecto 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
     }
  9. 3

    He creado una estática encabezados método por separado, en un APIManager clase.

    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 yo lo uso en solicitudes:

    Alamofire.request(urlString,
                          method: .get,
                          headers:APIManager.headers())
  10. 2
       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) ")
                }
        }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea