Alamofire URLRequestConvertible 全局 headers

Alamofire URLRequestConvertible global headers

最近,我用 URLRequestConvertible 协议替换了旧的 Alamofire 请求,例如,国家路线是这样的:

enum CountryRoute: URLRequestConvertible {

    case countries

    var path: String {
        switch self {
        case .countries : return Path.Common.countries.rawValue
        }
    }

    var method: HTTPMethod {
        return .get
    }

    public var headers: HTTPHeaders {
        return ["X-Mode" : "Light"]
    }

    func asURLRequest() throws -> URLRequest {
        let url = try "example.com".asURL()
        var request = URLRequest(url: url.appendingPathComponent(path))
        request.httpMethod = method.rawValue
        request.headers = headers
        request.timeoutInterval = TimeInterval(10*1000)
        return try URLEncoding.default.encode(request,with: nil)
    }
}

最后的请求是这样的:

shared.session.request(convertible).validate().responseData { (response) in   
    // Do something    
}

据我所知,我们为每条路线设置了 headers,但是如果我们有全局 headers,比如 "Content-Type""Accept-Language" 甚至 Bearer Token?

有什么方法可以防止重复添加 headers 并在全局添加它们?或者我们必须将这些 headers 添加到每条路线?

当您使用默认 Session:

时,Alamofire 已经为整个 session 生成了一些 headers
let session = Session.default

AF 参考(在幕后使用默认 Session

那些默认的 header 包括 Accept-EncodingAccept-LanguageUser-Agent。至于Content-Typeheader、URLEncodingJSONEncoding则负责设置正确的值。 (JSONParameterEncoderURLEncodedFormParameterEncoder 当您将 Encodable 类型作为参数传递时)

但是,您可以通过使用您自己的 URLSessionConfiguration:

创建新的 Session 来覆盖那些 header
let configuration = URLSessionConfiguration.af.default // Alamofire's default URLSessionConfiguration
configuration.headers["Content-Type"] = "application/json"
let session = Session(configuration: configuration)

注意:对于 Bearer 令牌,有一种机制需要执行 RequestInterceptor 协议才能拦截每个请求并附加正确的 header。使用相同的协议,您还可以提供刷新令牌功能。