前一个项目用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的需求,怎么发现用起来那么辛苦啊。
看来都没有人遇过这种问题啊。
我在AFN的Github讨论组里问也没结果,我也知道AFN中所有Authentication的部分其实都是由iOS SDK API提供的支持,但是底层API确实只提供收到Challenge后才被动发送Credential,没有主动发送的接口,或者相当深,我实在发现不了,完全不知道那个 NSURLAuthenticationChallengeSender 是如何进行重发Request的,底层API对这个部分太封闭了。
现在只能用回ASI,还是ASI这种可控性更强一些。
NSURLAuthenticationChallengeSender由NSURLConnection实现,的确不知道NSURLConnection怎么在回调didReceiveAuthenticationChallenge后重发request的,最近正打算用CFNetwork实现https的重发,因为challenger的sender不能直接用NSURLConnection赋值,那还得自己实现NSURLAuthenticationChallengeSender,不靠谱呀……
3楼 @nickel NSURLConnection实现了NSURLAuthenticationChallengeSender,但没有暴露出来,调试的时候就可以看到sender的地址就是connection。这个可以参考一下,https://github.com/graetzer/Foxbrowser/blob/master/External/SGURLProtocol/SGHTTPURLProtocol.m,他重新封装了下Challenge,使用CFHTTPAuthentication来处理https,用NSURLProtocol的子类来实现NSURLAuthenticationChallengeSender,就是不知道效果怎么样。 我也不想干这种重复工作,自己实现的肯定不够健壮全面。老大给的任务不得不弄呀…………