我只是在探索使用Alamofire而且非常出色,但我想做一些我认为可能不确定的事情。
我们对服务器的身份验证使用一次性使用的承载令牌。因此,对于每个请求,我必须存储随该请求发送的新令牌。
我想要做的是拦截每个回复的回复并检查Authorisation
标题。将其保存到磁盘,然后转发到等待实际数据的位置。
Alamofire有可能吗?
如果是的话,请你指点我正确的方向。
由于
答案 0 :(得分:5)
好的,在对github进行了一些搜索之后,我决定通过扩展Request
类型来创建一个新的响应序列化器。
我创建了一个新的saveAuth()
块,就像这样...
extension Request {
public static func AuthSaver() -> ResponseSerializer<Bool, NSError> {
return ResponseSerializer { request, response, data, error in
guard error == nil else { return .Failure(error!) }
if let auth = response?.allHeaderFields["Authorization"] as? String {
Router.OAuthToken = auth // this uses a didset on the Router to save to keychain
}
return .Success(true)
}
}
public func saveAuth() -> Self {
return response(responseSerializer: Request.AuthSaver()) {_ in}
}
}
我可以称之为......
Alamofire.request(Router.Search(query: query))
.validate()
.responseSaveAuth() // this line
.responseJSON {
response in
// ...
}
它仍然需要在每个地方添加我想要删除新发送的身份验证令牌,但这意味着我可以选择何时不执行此操作并且它只是一行代码。
它可能不是扩展程序中最优雅的代码(我仍然可以解决所有问题),但每次都可以更轻松地保存身份验证。
答案 1 :(得分:1)
我通过在我的应用中只有一个发送网络请求的地方解决了这个问题。基本上,我有一个&#34;网络管理员&#34;构建NSURLRequests并将它们传递给一个实际发送请求的函数(在我的例子中它是一个NSOperation子类)。这样,我只有一个位置,我正在阅读来自的回复。