美文网首页iOS开发总结
对CustomHTTPProtocol的理解

对CustomHTTPProtocol的理解

作者: Auditore | 来源:发表于2017-02-06 18:41 被阅读22次

整理了下关于CustomHTTPProtocol的知识,顺带画了张流程图,方便自己梳理。

CustomHTTPProtocol.m流程 (3).png

1.初始化请求canInitWithRequest
不是所有请求都要经过定制的协议来走,我们自己定制实现的Protocol可以根据不同条件筛选请求,同时对请求做更完整的包装定义。
在NSURLProtocol.h的interface定义中,以下两个方法是比较关键的:

  • canInitWithRequest:
  • (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request;

使用canInitWithRequest:我们可以筛选出可以使用当前协议的request,其它的忽略掉,直接走其它协议或者默认实现。

2.规范化request canonicalRequestForRequest
这个方法用于过滤请求,通过shouldAccept来判断是否接受该request,例如由于只接受http和https所以不是这两者的请求则不接受,以及判断是否被标记,被标记意味着已经经过本类处理,则本类不再处理。

3.对request进行打标记flag
很多情况下,具体的通信实现最终可能还是要采用系统自身提供的默认实现,但却又需要我们做过滤包装。通常的办法是我们对request按需求场景做特定处理,最后返给系统,走默认实现。
但这样这个request很有可能会再次进入这个protocol,所以通常在对request进行完第一次处理后,打个标,下次进入canInitWithRequest时直接过滤掉。
所谓的打标就会涉及到对request的属性操作,需要如下方法:

  • (id)propertyForKey:(NSString *)key inRequest:(NSURLRequest *)request;
  • (void)setProperty:(id)value forKey:(NSString *)key inRequest:(NSMutableURLRequest *)request;
  • (void)removePropertyForKey:(NSString *)key inRequest:(NSMutableURLRequest *)request;

大家可能会想,这样的方法不应该是NSURLRequest类的么?或者是Category?
是的,看起来是可以这样的。但大家注意到这是NSURLProtocol的类(+)方法,也就是说这里的API是以工具方法提供的。

4.协议内容实现和与client交互
下面说实现协议最重要的部分,做一个Protocol总要有实现的。重写如下两个方法,在方法内部实现定制

  • (void)startLoading;
  • (void)stopLoading;

    在实现这两个方法时,通过URL Loading System和上层打交道是一定要有的。这就是NSURLProtocol.h中的另一部分内容——NSURLProtocolClient。NSURLProtocolClient是一个Objective-C的protocol,定义了一些方法。我们在实现startLoading/stopLoading时,我们只要在有必要和系统交互时拿到self.client对象调用就好,client会由上下文实例化好供我们使用。
  1. 对请求代理回调进行处理
    在代理回调中处理authentication challenge,请参考文章:iOS-HTTPS

参考文献:
1.iOS 开发中使用 NSURLProtocol 拦截 HTTP 请求
2.定制实现NSURLProtocol
3.对苹果CustomHTTPProtocol的理解
4.NSURLProtocol和NSRunLoop的那些坑
5.iOS-HTTPS

相关文章

  • 对CustomHTTPProtocol的理解

    整理了下关于CustomHTTPProtocol的知识,顺带画了张流程图,方便自己梳理。 1.初始化请求canIn...

  • 萌新讲故事之对苹果源码CustomHTTPProtocol的解读

    以下为自言自语可以跳过 由于公司需求需要对WebView进行离线缓存,之前也在网上看了许多的帖子和文章下载了几个D...

  • CustomHTTPProtocol Read Me逐行翻译

    本文是逐行翻译,便于参照原文,如有歧义或者疑问请阅读原文比较。于 2017.1.25===============...

  • 对理解的理解

    坚强的人不好做,再大的苦楚也不能说。 儿女情长为何愁,没有事业哪来的人生风流!任凭一路坎坷,也要一路高歌。...

  • 我对理解的理解

    时下,最值得珍惜的就是信任, 感恩别人对自己的一份信任,理解别人对自己的不理解,这就是我对理解的理解

  • 再谈对“理解”的理解

    再谈对“理解”的理解 1956年版《布卢姆目标分类学》里奖认知的维度分为:记忆、理解、分析、应用、评价和创造。 安...

  • 对“。。。。。。”的理解

    就在昨天,我瞬间被“。。。。。。”惹怒了,原因很简单,就是在30秒内,看见了连续3个“。。。。。。”,最后...

  • 对MQTT的理解

    MQTT定义了14种类型的控制消息;MQTT中只规定了整数数据采用大端字节序,所以要注意像【剩余长度(Remain...

  • 对母亲的理解

    挡风玻璃越来越模糊,不是因为下雨,而是泪水…… 母亲的话依然在耳边回荡,刺痛着我,作为一个母亲,她怎么...

  • 对奋斗的理解

    【什么是奋斗 】奋斗就是每一天都很难,可一年比一年容易。不奋斗就是每一天都很容易,可一年比一年越难。怕吃苦的人吃苦...

网友评论

    本文标题:对CustomHTTPProtocol的理解

    本文链接:https://www.haomeiwen.com/subject/qjyuittx.html