问题标签 [nsurlprotocol]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
236 浏览

objective-c - 继承 NSURLProtocol 时调用实例方法

所以我不得不继承 NSURLProtocol 因为我使用的是 UIWebView 并且想要拦截 ajax 调用,这在这个例子中工作得很好。我必须从+ (BOOL)canInitWithRequest:(NSURLRequest *)request导致问题的请求中获取数据,我现在需要调用实例方法来处理数据,但我不能,因为它是一个类方法。

如何根据请求中的内容调用实例方法?

0 投票
2 回答
2195 浏览

ios - 缓存不适用于自定义 NSURLProtocol

我正在尝试为 NSURLProtocol 创建一个子类。但是,我注意到当我注册我的子类时,我似乎失去了缓存功能,即使它不应该做任何事情。例如,如果我对同一个 URL 多次执行 [NSURLConnection sendSynchronousRequest...] 而不注册子类,它只会执行一个实际的 http 请求。注册了这个子类后,它每次都会执行一个网络请求。

这是我的代码:

0 投票
4 回答
1434 浏览

ios - iOS:将自定义 NSURL 传递给 NSURLProtocol

我需要传递一些额外的信息,UIWebView loadRequest:以便它达到我的NSURLProtocol. 信息不能绑定,NSURLRequest因为信息也必须保留NSURLRequest mainDocumentURL。所以我用它进行子类化NSURL和构建NSURLRequest。我已经知道NSURLRequestwhichreachNSURLProtocol startLoading不是我提供给的实例UIWebView loadRequest,所以我也实现NSURL copyWithZone了,天真地期待 URL 加载系统会使用它。

现在,NSURLProtocol canInitWithRequest不是像人们合理预期的那样被调用一次,而是在之前至少被调用了 4 次startLoading。前 2 次,传入的NSURLRequest仍然包含我的自定义NSURL实现。然后一个不幸的内部代码CFURLCopyAbsoluteURL要求absoluteURL我的自定义NSURL和下一个canInitWithRequest(和后续startLoading的)已经获得了一个全新NSURLRequest的全新NSURLcopyWithZone永远不会被调用,并且我的子类NSURL丢失了。

在我放弃并实施一个将东西直接附加到 URL 字符串的劣质且脆弱的解决方案之前,我想问问更高级别的向导,他们是否找到了一种方法来捕捉NSURLProtocol雷达上的初始闪烁或如何CFURLCopyAbsoluteURL欺骗携带我的自定义实例。我试图NSURL absoluteURL通过再次返回我的自定义 NSURL 类的新实例来破解,但它没有帮助。我已经看到了一些NSURLProtocol setProperty功能上的承诺,但现在它似乎毫无用处。URL加载系统愉快地创建了一切的新实例,并且NSURLRequest到达NSURLProtocol似乎与UIWebView偶然输入的相同。

更新:好的,我想让帖子尽可能短,但即使是第一个回复也要求提供技术背景,所以我们开始吧:我UIWebView在 app 中有多个 s。这些视图可以同时运行请求,并且绝对可以运行相同 URL 的请求。它就像桌面浏览器中的选项卡。但我需要区分UIWebView每个特定NSURLRequest到达的来源NSURLProtocol。我需要每个 URL 请求都携带一个上下文。我不能简单地将 URL 映射到数据,因为多个UIWebViews可能随时加载相同的 URL。

更新 2:附加上下文信息NSURL是首选,据我所知,这是唯一可用的。问题是对页面内引用的资源(图像等)的请求根本没有通过UIWebViewDelegateNSURLProtocol直接进入。在NSURLProtocol. 此类请求的唯一上下文链接是它们的NSURLRequest mainDocumentURL.

0 投票
0 回答
1496 浏览

ios - NSPOSIXErrorDomain 代码 54。“操作无法完成。对等方重置连接”

尝试通过代理服务器将输入的 URL 重定向到新请求时出现上述错误。

[[self client] URLProtocol:self wasRedirectedToRequest:newRequest redirectResponse:response];

0 投票
1 回答
413 浏览

java - 自定义 URL 方案作为现有 URL 方案的适配器

是否有一种干净且符合规范的方法来定义自定义 URL 方案,该方案充当另一个 URL 返回的资源的适配器?

我已经定义了一个自定义 URL 协议,它返回本地文件的解密表示。因此,例如,在我的代码中,

透明地解密您将从file:///path/to/file. 但是,这仅适用于本地文件。没有什么好玩的!我希望 URL 规范允许一种简洁的方式,我可以通过将新的 URL 方案定义为现有 URL 上的一种适配器来概括这一点。

例如,我是否可以改为定义一个自定义 URL 方案decrypted:,该方案可用作适配器,为检索资源的另一个绝对 URL 加前缀?然后我可以做

decrypted:http://server/path/to/filedecrypted:ftp://server/path/to/file或什么的。这将使我的decrypted:协议可以与所有现有的进行文件检索的 URL 方案组合。

Java 对 URL 方案做了类似的事情,jar:但从我对RFC 3986的阅读来看,这种 Java 技术似​​乎违反了 URL 规范。嵌入的 URL 未正确进行字节编码,因此嵌入 URL 中的任何/?#分隔符都应正式视为嵌入 URL 中的段分隔符(即使JarURLConnection不是这样做的)。我想保持在规格范围内。

有没有一种很好正确的方法来做到这一点?或者是对整个嵌入式 URL 进行字节编码的唯一选择(即,decrypted:file%3A%2F%2F%2Fpath%2Fto%2Ffile不太好)?

我建议的(URL 适配器)是在其他任何地方完成的吗?还是有更深层次的原因导致这是被误导的?

0 投票
2 回答
6584 浏览

ios - 如何使用 NSURLProtocol 在 iOS 中拦截网络调用(REST)

我需要拦截客户端将在应用程序中进行的网络调用,同时调用将成功完成。我发现一个解决方案是实现 NSURLProtocol 抽象类并注册到应用程序。

这似乎解决了我的问题,但后来我碰壁了,请求超时。我使用 AFNetworking 最新的 1.x 版本,因为我需要支持 iOS 5.0。

所以现在我需要找到如何延长初始请求的超时时间或另一种更合适的解决方案来解决我的问题。

这是我所做的。NSURLProtocol 实现:

网络视图控制器:

这是日志输出:

2014-01-15 17:07:19.518 InterceptionHttp[510:1303] 拦截请求 startLoading 2014-01-15 17:07:19.520 InterceptionHttp[510:1303] URL: http://requestb.in/19kcum21 2014-01- 15 17:07:19.521 InterceptionHttp[510:1303] HTTP 方法:POST 2014-01-15 17:07:19.522 InterceptionHttp[510:1303] 数据:请求 AFNETWORKING 2014-01-15 17:07:29.522 InterceptionHttp[510: 400b] 拦截请求 stopLoading 2014-01-15 17:07:29.522 InterceptionHttp[510:70b] AFNetworking 错误:错误域 = NSURLErrorDomain 代码 = -1001“请求超时。” UserInfo=0x8a5cb10 {NSErrorFailingURLStringKey= http://requestb.in/19kcum21 , NSErrorFailingURLKey= http://requestb.in/19kcum21, NSLocalizedDescription=请求超时。, NSUnderlyingError=0x8a5c220 "请求超时。"}

编辑:

在 jqyao 回答并阅读文章后,我了解了一些关于子类化 NSURLProtocol 的主题。但不幸的是我仍然无法拦截HTTP,这意味着我希望原始请求能够正常继续。

同时,如果我添加调用 URLProtocol 委托选择器的 3 行,原始请求将继续,但会返回数据而不是服务器的响应。

这是我在startLoading方法中添加的内容。

这是我的输出日志。

2014-02-04 17:27:22.253 InterceptionHttp[419:3a03] 拦截请求 startLoading 2014-02-04 17:27:22.254 InterceptionHttp[419:3a03] URL: http ://requestb.in/tsvc14ts 2014-02- 04 17:27:22.255 InterceptionHttp[419:3a03] HTTP 方法:POST 2014-02-04 17:27:22.255 InterceptionHttp[419:3a03] 数据:{'message':'JSON_MESSAGE'} 2014-02-04 17: 27:22.258 InterceptionHttp[419:70b] AFNetworking 响应:{'message':'JSON_MESSAGE'} 2014-02-04 17:27:22.260 InterceptionHttp[419:1303] 拦截请求 stopLoading

0 投票
1 回答
467 浏览

objective-c - 如何使用 OCMock 或 OCMockito 验证对 NSURLProtocol 模拟的方法调用?

我想测试一个发出 GET 请求的方法。

这是一个人为的例子:

与其担心此方法的实现细节(例如,模拟、设置期望,然后验证依赖项),我更愿意能够测试是否发出了 GET 请求。

我相信我可以用NSURLProtocol做到这一点,但到目前为止我的尝试都没有成功。

例如,使用 OCMock:

上述测试失败,因为从未调用过 canInitWithRequest。

如何在 NSURLProtocol 上设置期望以验证请求是否正在发出?

0 投票
1 回答
689 浏览

ios - NSURLProtocol 视频请求失败

我在通过 NSURLProtocol 子类中的特殊协议方案处理视频请求时遇到了一些问题。其他所有资源(图像/文本)都得到了正确处理,但是,当发送视频请求时,我只接到“canInitWithRequest”的电话,没有跟进。所以,我的视频资源没有得到解决。现在,我环顾四周,并没有找到明确的解决方案。有些人改用嵌入式 HTTP 服务器,但这似乎有点矫枉过正。有谁知道这是否是一个错误,如果不是,为什么会有这个限制,是否有解决方法?

类似的问题:WebView 的自定义 NSURLProtocol 类在 HTML5 文档中加载视频时不起作用,但不幸的是没有答案。

0 投票
1 回答
477 浏览

ios - NSURLProtocol canInitWithRequest 调用 5 次

我正在研究一个hybrid application framework. 我需要request从某个地方捕获所有内容,并且我喜欢一些博客,它说我可以使用 custom 来做到这一点NSURLProtocol。我做了它所说的一切,但我有一些问题。

当我加载http://www.google.com到我的 webview 时,它会canInitWithRequestmycustomprotocol.m. 但我不想打电话 5 次。

  1. 2014-03-13 15:51:50.675 混合[9334:60b]http://www.google.com/
  2. 2014-03-13 15:51:50.677 混合[9334:60b]http://www.google.com/
  3. 2014-03-13 15:51:50.683 混合[9334:60b]http://www.google.com/
  4. 2014-03-13 15:51:50.685 混合[9334:60b]http://www.google.com/
  5. 2014-03-13 15:51:50.686 混合[9334:60b]http://www.google.com/
  6. 2014-03-13 15:51:54.474 混合[9334:3807]http://www.google.com/
  7. 2014-03-13 15:51:54.508 混合[9334:3807]http://www.google.com/images/logo_ret_2.png
  8. 2014-03-13 15:51:54.509 混合[9334:3807]http://www.google.com/images/logo_ret_2.png
  9. 2014-03-13 15:51:54.510 混合[9334:3807]http://www.google.com/images/logo_ret_2.png

我只加载google过一次。为什么canInitWithRequest之前调用了五次startLoading?请帮忙!

0 投票
3 回答
920 浏览

ios - 为什么不在我的 NSURLProtocol 子类中调用 startLoading?

我正在查看 NSURLProtocol 并尝试插入一些标题。

但我的 startLoading 从未被调用