URLProtocol实现中NSMutableURLRequest与URLRequest对比及请求标记需求
在MYURLProtocol外部实现请求属性关联(标记请求)
嘿,这事儿其实很简单,完全不用碰你自定义的MYURLProtocol内部代码,直接用NSURLProtocol官方提供的两个类方法就能在外部给请求关联属性(也就是文档里说的「标记请求」)。
1. 给请求设置关联属性
要给请求绑定属性,你需要用NSURLProtocol.setProperty(_:forKey:in:)方法,注意这个方法只接受NSMutableURLRequest类型的请求,所以如果你的原始请求是不可变的URLRequest,得先转成可变版本再操作。
举个实际的例子,比如我们要给某个请求标记“需要启用自定义缓存”:
// 1. 创建或获取可变请求 let targetURL = URL(string: "https://your-api-domain.com/data")! var mutableRequest = NSMutableURLRequest(url: targetURL) // 或者如果原始是不可变请求,转成可变: // let originalRequest: URLRequest = ... // let mutableRequest = originalRequest.mutableCopy() as! NSMutableURLRequest // 2. 设置关联属性,key建议用带项目前缀的唯一字符串,避免冲突 NSURLProtocol.setProperty(true, forKey: "com.yourproject.NeedCustomCache", in: mutableRequest)
2. 读取请求的关联属性
之后不管是在你的MYURLProtocol拦截逻辑里,还是其他需要判断的地方,都可以用NSURLProtocol.property(forKey:in:)方法读取之前绑定的属性,这个方法支持URLRequest和NSMutableURLRequest两种类型。
示例代码:
// 拿到目标请求(可变/不可变都可以) let request: URLRequest = mutableRequest as URLRequest // 读取属性并做类型转换 if let needCustomCache = NSURLProtocol.property(forKey: "com.yourproject.NeedCustomCache", in: request) as? Bool { if needCustomCache { // 在这里执行对应的自定义逻辑,比如启用特殊缓存策略 print("这个请求需要启用自定义缓存") } }
几个关键注意点
- Key值唯一性:建议给自定义的key加上项目前缀(比如
com.yourproject.xxx),避免和系统、第三方库的key冲突,导致属性被意外覆盖。 - 属性类型限制:绑定的属性必须是符合
NSCopying协议的类型,或者是对象类型(因为底层是用NSDictionary存储的),所以尽量用基础类型或者可拷贝的自定义对象。 - 请求传递性:这些关联属性会跟着请求一起被传递,所以你的
MYURLProtocol在调用canInit(with:)或者startLoading()方法时,能直接读取到外部设置的标记。
内容的提问来源于stack exchange,提问作者RickiG
相关产品推荐
相关产品推荐

