如何使用 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。