如何使用Alamofire自定义标题

我刚刚开始看看Mattt的新Alamofire swiftnetworking库,我不太确定如何使用自定义头文件。

我试图从AFNetworking转换到Alamofire的代码是这样的:

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

根据官方文档,不build议修改会话configuration:

这不build议用于授权或内容types标题。 相反,分别使用URLRequestConvertible和ParameterEncoding。

所以URLRequestConvertible用于授权的一个示例用法是:

 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 } } 

当你想提出要求时:

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

有关URLRequestConvertible的更多信息: https : //github.com/Alamofire/Alamofire#urlrequestconvertible

老答案

从Alamofire v1.0开始,Pers的答案不再有效。 在新版本中,额外的头文件应该被添加到HTTPAdditionalHeaders属性中

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

更多信息在这里: https : //github.com/Alamofire/Alamofire/issues/111

对于从请求到请求的标头,可以直接将它们传递给请求方法。 从文档:

在全局请求方法中直接支持将自定义HTTP标头添加到请求。 这样可以轻松地将HTTP头附加到可以不断变化的请求。

并给出的例子:

  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) } 

但是,如果您希望设置不改变的标头,build议您在NSURLConfiguration对象上这样做,正如其他人在此提到的那样。

在这个时候,Sw​​ift 3.0,Xcode 8.x,Alamofire 4.x:

您可以使用自定义标题如下所示:

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

供参考

注意:这是在1.0之前。 它不再有效,而是看看接受的答案。

您可以使用Manager单例中的defaultHeaders属性来添加标题,如下所示:

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

至less它适合我。 🙂

因为我不喜欢在全球范围内设置这些东西(有时我会发送这些东西,有时我不会),所以我写了一个包装器方法来为每个调用设置标头。

 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) } } 

它可以被称为如下…

 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*/ 

它当然可以用一些错误检查来清理,但是这应该给你一个这样的要点。 这一切都基于Alamofire 1.2。

设置下面的代码将只适用于iOS 8及以上。

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

以下是适用于iOS 7和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 } 

更多信息: GitHub – Alamofire问题

你可以直接传递一个NSMutableURLRequest对象给Alamofire,因为它有一个NSMutableURLRequest的扩展,它使用了URLRequestConvertible 。 所以没有必要创build你自己的类来添加一个授权头。 这很简单:

 let request = NSMutableURLRequest(URL: url) request.setValue(authorizationToken, forHTTPHeaderField:"Authorization") Alamofire.request(request) .responseJSON { (_, _, JSON, error) in } 
  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) ") } }