Alamofire:遵循 HTTP 重定向(或不遵循)

Alamofire: Follow HTTP redirects (or not)

我正在尝试将 Alamofire 配置为在每个请求的基础上遵循重定向(或不遵循)。

Alamofire 有一个私有的内部 class SessionDelegate 作为当前 URL 会话的 NSURLSessionTaskDelegateSessionDelegate 确实实现了相关的委托方法,URLSession(session:, task:, willPerformHTTPRedirection response:, request:, completionHandler:) 这正是我想要的。

更好的是,委托的实现参考了一个名为 taskWillPerformHTTPRedirection 的自定义变量闭包来确定如何处理重定向 - 再一次,这正是我想要的!

而且据我所知,默认情况下闭包总是 nil——Alamofire 没有在内部分配它——这表明它旨在让用户将闭包分配给它。

问题:我无法访问此私有 SessionDelegate class 来为其 taskWillPerformHTTPRedirection 变量分配闭包。它是私有的 class,对我的 Swift 文件不可见。将 Alamofire 请求配置为(不)遵循重定向的正确方法是什么?

我认为这个问题很久以前就已经讨论过了,请查看此 issue

matt 的回答很明确:

I presume various closure-typed properties in SessionDelegate, TaskDelegate, DataTaskDelegate and DownloadTaskDelegate are intended to be used by clients to extend/override particular delegates behavior.


Actually, that's incorrect. These are implemented internally for the sake of completeness. Any functionality intended for the end user would be exposed on Manager or Request.

无论如何我看到赏金是由 Aaron 提供的,而 Jonathan 分叉了他自己的 version,所以你为什么不使用那个分叉?

由于 another pull request,灵活的重定向处理现在在 Alamofire 中,并且可用于 Alamofire 1.2.0

你可以这样使用

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let sessionDelegate = Manager.SessionDelegate()
sessionDelegate.taskWillPerformHTTPRedirectionWithCompletion = {
   (session: NSURLSession, task: NSURLSessionTask, response: NSHTTPURLResponse,
    newRequest: NSURLRequest, completionHandler: NSURLRequest? -> Void) in

    // do something
}

let manager = Manager(configuration: configuration, delegate: sessionDelegate)

Alamofire 管理器保持 delegate 强大,因此您可以放心

public let delegate: SessionDelegate

但记住 willPerformHTTPRedirection

This method is called only for tasks in default and ephemeral sessions. Tasks in background sessions automatically follow redirects.

阅读基础知识也很不错Handling Redirects and Other Request Changes