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-Encoding、Accept-Language 和 User-Agent。至于Content-Typeheader、URLEncoding
或JSONEncoding
则负责设置正确的值。 (JSONParameterEncoder
或 URLEncodedFormParameterEncoder
当您将 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。使用相同的协议,您还可以提供刷新令牌功能。
最近,我用 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
:
let session = Session.default
或 AF
参考(在幕后使用默认 Session
)
那些默认的 header 包括 Accept-Encoding、Accept-Language 和 User-Agent。至于Content-Typeheader、URLEncoding
或JSONEncoding
则负责设置正确的值。 (JSONParameterEncoder
或 URLEncodedFormParameterEncoder
当您将 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。使用相同的协议,您还可以提供刷新令牌功能。