拦截Alamofire的每一个回应

时间:2016-06-08 16:19:27

标签: ios swift alamofire

我只是在探索使用Alamofire而且非常出色,但我想做一些我认为可能不确定的事情。

我们对服务器的身份验证使用一次性使用的承载令牌。因此,对于每个请求,我必须存储随该请求发送的新令牌。

我想要做的是拦截每个回复的回复并检查Authorisation标题。将其保存到磁盘,然后转发到等待实际数据的位置。

Alamofire有可能吗?

如果是的话,请你指点我正确的方向。

由于

2 个答案:

答案 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子类)。这样,我只有一个位置,我正在阅读来自的回复。