Alamofire:跟随HTTP重定向(或不跟随)

28

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

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

更好的是,代理的实现会查阅名为taskWillPerformHTTPRedirection的自定义变量闭包来确定如何处理重定向 - 这正是我想要的!

据我所知,该闭包总是默认为nil - 它不是由Alamofire在内部分配的 - 这表明它旨在让用户对其进行分配。

问题在于:我无法访问此私有的SessionDelegate类,以将闭包分配给其taskWillPerformHTTPRedirection变量。它是一个私有类,我的Swift文件看不到它。配置Alamofire请求以遵循(或不遵循)重定向的正确方法是什么?


Alamofire和AFNetworking一样尊重HTTP标准。因此,我认为它会自动跟随重定向。我知道这是因为我之前更改过域名,应用程序可以毫无问题地跟随重定向。 - Eddwin Paz
AFNetworking可以配置为不遵循重定向。Alamofire肯定有基础来做同样的事情。 - Jonathan Hersh
由于Alamofire代码量不大且是一个相对年轻的库,我建议您直接fork该库并使用taskWillPerformHTTPRedirection实现所需功能,正如您正确指出的那样。然后提交PR即可。似乎@mattt从一开始就放置了这些钩子,即使它们尚未被Alamofire公共API使用。 - Teemu Kurppa
1
@TeemuKurppa:你当然是正确的,我已经做了。 :) - Jonathan Hersh
这个问题困扰了我很长时间。感谢这个问题,我再次查看时才注意到底部的选择器开关。我只是在Alamofire中手动设置了闭包,这看起来不像你的解决方案那么好,但如果有人看到这个并需要一个快速解决方案,直到合并完成,它应该可以工作。谢谢! - Tony
1
我开了一个悬赏以引起更多关注。请参见Hersh先生在https://github.com/Alamofire/Alamofire/pull/350的初始实现。 - Aaron Brager
3个回答

10

感谢 另一个拉请求,现在Alamofire已经支持灵活的重定向处理,并且可在Alamofire 1.2.0中使用。


我创建了一个自定义的 SessionDelegate 类。Alamofire.SessionDelegate 属性是不可设置的。如何在 Alamofire 中停止重定向。 - pkc456

7
您可以这样使用它。
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 Manager将delegate设置为强引用,这样您就可以放心使用。
public let delegate: SessionDelegate

请记住willPerformHTTPRedirection方法仅适用于默认和短暂会话中的任务。后台会话中的任务会自动遵循重定向。

还可以阅读基础知识:处理重定向和其他请求更改


0

我认为这个问题早就讨论过了,可以查看这个issue

matt的回答很清楚:

我假设SessionDelegate、TaskDelegate、DataTaskDelegate和DownloadTaskDelegate中的各种闭包类型属性是为了让客户端扩展/覆盖特定代理行为而设计的。


实际上,那是不正确的。这些是为了完整性而在内部实现的。任何面向最终用户的功能都将在ManagerRequest上公开。
无论如何,我看到赏金是由Aaron提供的,而Jonathan则分叉了他自己的version,那么为什么不使用那个分叉呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接