如何使用 alamofire 设置默认 http header
how to set a default http header with alamofire
我想设置一个 header 以便在用户登录后所有请求都包含一个授权令牌 header。我想我可以在共享的 alamofire 管理器中设置 header通过调用我的 setToken
函数,但我认为我做的不正确。我的错误是什么?是否有更好的方法为所有 alamofire 请求设置默认 header?
class UserService : NSObject {
static let manager: Alamofire.Manager = Alamofire.Manager(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
class func setToken(token:String){
manager.session.configuration.HTTPAdditionalHeaders = [
"x-token": token
]
}
class func addFriend(user:LoggedUser, uname:String, callback:((success: Bool, errorMsg: String?)->Void)) {
let params:[String : AnyObject] = ["uname": uname]
let url = AppConfig.sharedInstance().baseURL() + "/user/\(user.userId!)/friends"
Alamofire.request(.POST, url , parameters:params, encoding:.JSON)
.responseJSON(options: .MutableContainers, completionHandler:{ (request, response, JSON, error) -> Void in
//token is not set in the request
}
}
所以我的错误是在发出请求时使用了 class 函数而不是共享实例。
所以应该是
Alamofire.Manager.sharedInstance.request(.POST, url , parameters:params, encoding:.JSON)
而不是
Alamofire.request(.POST, url , parameters:params, encoding:.JSON)
您的代码从不使用自定义管理器,请使用以下代码:
class CustomManager: Manager {
static public let manager = CustomManager.generateManager()
class func generateManager()-> CustomManager {
var defaultHeaders = Alamofire.Manager.defaultHTTPHeaders ?? [:]
defaultHeaders["x-token""] = "token"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders
let manager = CustomManager(configuration: configuration)
return manager
}
}
class UserService : NSObject {
class func addFriend(user:LoggedUser, uname:String, callback:((success: Bool, errorMsg: String?)->Void)) {
let params:[String : AnyObject] = ["uname": uname]
let url = AppConfig.sharedInstance().baseURL() + "/user/\(user.userId!)/friends"
CustomManager.manager(.POST, url , parameters:params, encoding:.JSON)
.responseJSON(options: .MutableContainers, completionHandler:{ (request, response, JSON, error) -> Void in
// ...
}
}
如果您在 Alamofire 4 中使用自定义 SessionManager
,现在在 Alamofire 5 中它被称为 Session
,您可以这样创建它:
let configuration = URLSessionConfiguration.default
var defaultHeaders = HTTPHeaders.default
defaultHeaders["X-API-Version"] = "1.0"
configuration.headers = defaultHeaders
let yourManager = Alamofire.Session(configuration: configuration)
创建一个符合 RequestAdapter 协议的 class。您将必须实现此功能 func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
。里面做:
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequest = urlRequest
urlRequest.setValue("YourUserAgent", forHTTPHeaderField: "User-Agent")
return urlRequest
}
在这个函数中你可以添加任何你想要的headers。
然后做:
sessionManager.adapter = "Class that conforms to RequestAdapter"
,其中 sessionManager 是您的 Alamofire SessionManager。
我想设置一个 header 以便在用户登录后所有请求都包含一个授权令牌 header。我想我可以在共享的 alamofire 管理器中设置 header通过调用我的 setToken
函数,但我认为我做的不正确。我的错误是什么?是否有更好的方法为所有 alamofire 请求设置默认 header?
class UserService : NSObject {
static let manager: Alamofire.Manager = Alamofire.Manager(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
class func setToken(token:String){
manager.session.configuration.HTTPAdditionalHeaders = [
"x-token": token
]
}
class func addFriend(user:LoggedUser, uname:String, callback:((success: Bool, errorMsg: String?)->Void)) {
let params:[String : AnyObject] = ["uname": uname]
let url = AppConfig.sharedInstance().baseURL() + "/user/\(user.userId!)/friends"
Alamofire.request(.POST, url , parameters:params, encoding:.JSON)
.responseJSON(options: .MutableContainers, completionHandler:{ (request, response, JSON, error) -> Void in
//token is not set in the request
}
}
所以我的错误是在发出请求时使用了 class 函数而不是共享实例。
所以应该是
Alamofire.Manager.sharedInstance.request(.POST, url , parameters:params, encoding:.JSON)
而不是
Alamofire.request(.POST, url , parameters:params, encoding:.JSON)
您的代码从不使用自定义管理器,请使用以下代码:
class CustomManager: Manager {
static public let manager = CustomManager.generateManager()
class func generateManager()-> CustomManager {
var defaultHeaders = Alamofire.Manager.defaultHTTPHeaders ?? [:]
defaultHeaders["x-token""] = "token"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders
let manager = CustomManager(configuration: configuration)
return manager
}
}
class UserService : NSObject {
class func addFriend(user:LoggedUser, uname:String, callback:((success: Bool, errorMsg: String?)->Void)) {
let params:[String : AnyObject] = ["uname": uname]
let url = AppConfig.sharedInstance().baseURL() + "/user/\(user.userId!)/friends"
CustomManager.manager(.POST, url , parameters:params, encoding:.JSON)
.responseJSON(options: .MutableContainers, completionHandler:{ (request, response, JSON, error) -> Void in
// ...
}
}
如果您在 Alamofire 4 中使用自定义 SessionManager
,现在在 Alamofire 5 中它被称为 Session
,您可以这样创建它:
let configuration = URLSessionConfiguration.default
var defaultHeaders = HTTPHeaders.default
defaultHeaders["X-API-Version"] = "1.0"
configuration.headers = defaultHeaders
let yourManager = Alamofire.Session(configuration: configuration)
创建一个符合 RequestAdapter 协议的 class。您将必须实现此功能 func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
。里面做:
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequest = urlRequest
urlRequest.setValue("YourUserAgent", forHTTPHeaderField: "User-Agent")
return urlRequest
}
在这个函数中你可以添加任何你想要的headers。
然后做:
sessionManager.adapter = "Class that conforms to RequestAdapter"
,其中 sessionManager 是您的 Alamofire SessionManager。