swift - 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”甚至不记名令牌之类的全局标头怎么办?
有什么方法可以防止添加重复的标题并在全局范围内添加它们?或者我们必须将这些标头添加到每条路线?
解决方案
当您使用默认值时,Alamofire 已经为整个会话生成了一些标题Session
:
let session = Session.default
或参考(在幕后AF
使用默认值)Session
这些默认标头包括Accept-Encoding、Accept-Language和User-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
协议才能拦截每个请求并附加正确的标头。使用相同的协议,您还可以提供刷新令牌功能。
推荐阅读
- python - 有没有办法或 python 程序或脚本自动安装我拥有的一组 EXE?
- c - 我怎样才能有效地计时一个只有几个周期长的函数的执行时间?
- powershell - Dockerfile RUN powershell wget 并查看进度
- r - ggplot R中的误差线
- pdf - 使用“预览”对 PDF 文件进行密码保护时出现长时间延迟
- dialogflow-es - 对话流错误在平台响应中找不到 RichResponse 或 SystemIntent
- python - Google Kickstart 2020 C 轮 - 倒计时。无法理解为什么我的解决方案不正确
- java - 二维数组无法冻结一个对象并将所述对象复制到右侧 90 像素
- reactjs - React - 找不到模块:无法解析'@bootstrap-styled/v4'
- mysql - 从 MySQL 字段中删除带有通配符的 JSON 键