NSURLProtocol 拦截器

1iibhORPNGLz15jvM8h740Q.png

为了这篇文章的内容,写了一个小项目,支持 ObjectiveC,Swift 语言。 支持 Cocoapods 集成,主要功能是,网络拦截和 Mock 数据。 有兴趣的同学可以看看。

项目地址: https://github.com/zColdWater/HTTPInterceptor

一,NSURLProtocol 的介绍

Apple 官方文档 https://developer.apple.com/documentation/foundation/urlprotocol

NSURLProtocol 是一个抽象类,你不能直接创建这个实例,如果你想使用它的功能,你应该继承它创建属于自己的子类,然后重写 NSURLProtocol 的方法。

1.关于 NSURLProtocol 类定义

我们看下这个类的定义:

2.如何拦截呢,示例代码?

那么我们一般怎么用它来拦截 URL 呢? 我写了一个示例代码,MyURLProtocol 在页面最开始先注册好。 然后你可以创建任何已经有的标准协议 URL 还是你自定义的协议 URL,都可以。 然后通过 URLSession 创建一个会话,再用这个会话 loading 你的 URL,开始这个 task。 MyURLProtocol 就能够拦截到你的 URL 了,下面的例子。

例子输出:

例子代码:

3.做一个最简易版的 Mock 数据的例子

例子输出:

例子代码:

二,NSURLProtocol 的应用

项目地址: https://github.com/zColdWater/HTTPInterceptor

1.拦截器:

比如拦截一些网络请求,集中为某些规则的 URLRequest 添加一些参数或者再更改 URLResponse 等等操作。

WechatIMG1089.png

2.Mocker:

比如服务器 API 还没有开发完成,自己 Mock 假数据为了展示 UI 使用。

关于 拦截器Mocker 的应用,我写了一个开源项目,API 清晰,使用简单,支持 Cocoapods 集成,支持 Swift 和 ObjectiveC。

WechatIMG1088.png

三,总结

我再总结一下下哈。 首先是我写的项目真的挺好用,哈哈。

第一步: 注册自己的 URLProtocl 子类,在触发之前。 第二步: 在自己的子类里面完成拦截后的逻辑,比如是给个假数据,然后告诉拦截者获取数据完成了,还是不拦截,这个根据自己的需求。 第三步: 触发拦截行为,首先定义一个属于你自己的 URL,协议是选择 http 还是其他,还是自己的自定义协议都可以。然后创建 URLSession 会话,把这个 URL 搞进去,开始任务,发起获取数据的动作,这个时候就触发到拦截器啦。

希望大家这个时候都能理解该如何使用这个东东了。

最后更新于

这有帮助吗?