AFNetworking是否支持像ASI中setShouldPresentCredentialsBeforeChallenge的方法?

nickel 发布于 2014年07月29日 | 更新于 2014年08月05日
无人欣赏。

前一个项目用ASI,服务器端使用到HTTP Digest Athentication,为了避免每次请求都要收到401(challenge)后再重发的低效,所以 [request setShouldPresentCredentialsBeforeChallenge:YES],以便在后续请求时自动带上上一个Request所使用的Credential信息,在Challenge失效前,后续的Request都不需要经过两次发送。

现在的项目尝试采用AFNetworking,服务器端是同一个系统,即接口也需要使用到HTTP Digest Athentication。但现在问题是,虽然AFN支持HTTP Digest Athentication,但搜索了很久,也不知道如何在后续Request发送时自动应用上一个有效的Cretdentail信息,结果是每次请求都得自动重发一次,但最大的问题是,需要用Post上传文件的接口不但不会自动重发,而且就算重发也会极大降低效率。

翻了一遍AFN的文档,也查了NSURLConnection有关的几个类,也没找到有这样的设置。搜索Google也没找到。后来想用最笨的方法自行保存上一个Request成功使用的Credential信息,即打算自行保存Authorization头域中的值,但发现AFN的接口并不允许获取这个头域的值。

很想知道AFN或者NSURLConnection究竟是否支持这种需求??这个应该是很Basic的需求,怎么发现用起来那么辛苦啊。

共6条回复
nickel 回复于 2014年07月31日

看来都没有人遇过这种问题啊。

我在AFN的Github讨论组里问也没结果,我也知道AFN中所有Authentication的部分其实都是由iOS SDK API提供的支持,但是底层API确实只提供收到Challenge后才被动发送Credential,没有主动发送的接口,或者相当深,我实在发现不了,完全不知道那个 NSURLAuthenticationChallengeSender 是如何进行重发Request的,底层API对这个部分太封闭了。

现在只能用回ASI,还是ASI这种可控性更强一些。

kamous 回复于 2014年08月04日

NSURLAuthenticationChallengeSender由NSURLConnection实现,的确不知道NSURLConnection怎么在回调didReceiveAuthenticationChallenge后重发request的,最近正打算用CFNetwork实现https的重发,因为challenger的sender不能直接用NSURLConnection赋值,那还得自己实现NSURLAuthenticationChallengeSender,不靠谱呀……

nickel 回复于 2014年08月04日

@kamous 确实,估计很少人用到authentication的,而且就算用到可能也是最普通的需求,似乎没有人想过需要操控重发的Reuest的情况。我觉得连Apple自己也没认真想过这个问题,在NSURLConnection里也没有提供获NSURLAuthenticationChallengeSender的接口。

短期内我还是坚持使用ASI好过了,我觉得ASI的可塑性和可控制性还是远超AFN的。我建议你不要自己完全重写,没必要,ASI已经有个相当好的架构了,在ASI基础上添加符合自己需求的逻辑更好。

kamous 回复于 2014年08月04日

3楼 @nickel NSURLConnection实现了NSURLAuthenticationChallengeSender,但没有暴露出来,调试的时候就可以看到sender的地址就是connection。这个可以参考一下,https://github.com/graetzer/Foxbrowser/blob/master/External/SGURLProtocol/SGHTTPURLProtocol.m,他重新封装了下Challenge,使用CFHTTPAuthentication来处理https,用NSURLProtocol的子类来实现NSURLAuthenticationChallengeSender,就是不知道效果怎么样。 我也不想干这种重复工作,自己实现的肯定不够健壮全面。老大给的任务不得不弄呀…………

nickel 回复于 2014年08月04日

@kamous 你给的这个例子太棒了,很好的参考价值,虽然我已经换回ASI,目前也没有时间搞这个。看来你在这个问题上折腾得比我多多了。

不过,我虽然不清楚你老大给你的任务是啥,也不知道有没有其他更好的解决方案,不过我觉得最好你还是全面得考虑这个问题,找到最小工作量和风险的事(我指的是最好改别人的库),如果有更好的解决方案,你可以给老大做完整的建议,而不是盲从领导的需求。

kamous 回复于 2014年08月05日

5楼 @nickel 就是,折腾了好几天了,是老大给的练手作业,所以…………其实目的就是可以在URLProtocol中留出接口进行日志记录、request的header修改、cookie增删等,以减少在每次使用Connection的时候分别记录日志等的工作量。其实只是重写下URLConnection的网络请求的话,https://github.com/hhfa008/HTTPSURLProtocol这种是最简单的,直接在URLContent中截获请求,重新新建个Connection封装再次发送就行了,要用CFNetwork实现的话就更麻烦些

登录 或者 注册