【问题标题】:NSURLProtocol - handle https requestNSURLProtocol - 处理 https 请求
【发布时间】:2015-02-13 12:31:02
【问题描述】:

这是canInitWithRequest 中的NSURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
  // only handle http requests we haven't marked with our header.
  if ([[[request URL] scheme] isEqualToString:@"http"] &&
      ([request valueForHTTPHeaderField:RNCachingURLHeader] == nil)) {
    return YES;
  }
  return NO;
}  

但我希望 NSURLProtocol 也允许 https 请求。
我试过了,但是调用时所有请求都失败了:

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
  // only handle http requests we haven't marked with our header.
  if (([[[request URL] scheme] isEqualToString:@"http"] || [[[request URL] scheme] isEqualToString:@"https"]) &&
      ([request valueForHTTPHeaderField:RNCachingURLHeader] == nil)) {
    return YES;
  }
  return NO;

}

一个示例是具有 https 方案的登录请求。在上面的函数中,返回 YES 但是当登录请求被调用时,我在日志中得到这个错误:

Error Domain=NSURLErrorDomain Code=-1004 "无法连接到服务器。"

但是,如果我在 canInitWithRequest 中删除对 https 的检查,则不会出现错误。
我正在使用RNCachingURLProtocol 来缓存请求。
我怎样才能做到这一点。

【问题讨论】:

  • 检查您在if 中的哪一项测试是错误的。我尝试了您的代码,它通过了 isEqualToString: 测试,但我没有要测试的 RNCachingURLHeader 值。
  • @Larne : RNCachingURLHeader = @"X-RNCache"
  • 我无法重现您的问题。我试过了,但是 https 请求在您的 canInitWithRequest: 中与 http 请求具有相同的行为。在canInitWithRequest::日志[[request URL] scheme][request valueForHTTPHeaderField:RNCachingURLHeader]。另外,检查是否存在区分大小写的问题(您与lowercasescheme 进行比较)。

标签: ios objective-c nsurlprotocol


【解决方案1】:

只是为了测试和理解重构你的代码:

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
    NSString *scheme = [[[request URL] scheme] lowercaseString];
    BOOL supportedScheme = [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"];

    NSString *header = [request valueForHTTPHeaderField:RNCachingURLHeader];
    BOOL validHeader = header == nil;

    BOOL canInit = supportedScheme && validHeader;

    return canInit;
}

注意lowercaseString,这是防御性编码。

【讨论】:

  • 这似乎无法回答问题。
  • @JeffreyBosboom 对,它没有声称。没有其他选项可以显示格式。请注意问题的一部分:However if I remove check of https in canInitWithRequest, I get no error,这表明其中存在错误或至少存在一些混淆。在 OP 的问题中,实际上没有办法测试各个部分提供了什么,以及哪个部分(如果有)导致了失败。这种编码风格可能会帮助 OP 找到他的问题。
  • 所以这应该是一个评论?没有答案?
【解决方案2】:

“无法连接到服务器”表示您处于离线状态,但在缓存中找不到您请求的 URL。

查看startLoading。检查 URL 的绝对字符串。确保您缓存的那个与您现在请求的那个完全相同。如果你在你的 URL 中放了任何可变的数据,那么它就不会匹配。

我刚刚注意到,我认为我已在此代码中修复的许多小问题实际上是待处理的拉取请求。 So I've merged most of those now. 特别是,我散列 URL 的方式很容易发生冲突。那是固定的。并且更新后的代码增加了对非 http 的支持。 (但您的错误仍然表明 URL 不匹配。)

【讨论】:

  • initialize 函数仅在 git 上的更新代码中注册 http。 [self setSupportedSchemes:[NSSet setWithObject:@"http"]];
  • 这只是默认设置。您可以将属性设置为包含 https 而无需破解代码。
  • 我尝试为支持的方案设置 https:[self setSupportedSchemes:[NSSet setWithObjects:@"http", @"https", nil]];在初始化函数中。但是仍然没有调用 https 请求。所以我什至无法检查是否存在 url 不匹配,因为 https 没有调用 startLoading。
猜你喜欢
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多