首页 > 解决方案 > Alamofire URLRequestConvertible 全局标头

问题描述

最近,我将旧的 Alamofire 请求替换为 URLRequestConvertible 协议,例如,国家/地区路由是这样的:

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    
}

据我了解,我们为每条路由设置了标头,但是如果我们有诸如“Content-Type”“Accept-Language”甚至不记名令牌之类的全局标头怎么办?

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

标签: swifthttp-headersalamofire

解决方案


当您使用默认值时,Alamofire 已经为整个会话生成了一些标题Session

let session = Session.default

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

这些默认标头包括Accept-EncodingAccept-LanguageUser-Agent。至于Content-Type header,URLEncoding还是JSONEncoding负责设置正确的值。(JSONParameterEncoder或者URLEncodedFormParameterEncoder当您将Encodable类型作为参数传递时)

Session但是,您可以通过使用自己的创建一个新的来覆盖这些标题URLSessionConfiguration

let configuration = URLSessionConfiguration.af.default // Alamofire's default URLSessionConfiguration
configuration.headers["Content-Type"] = "application/json"
let session = Session(configuration: configuration)

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


推荐阅读