1

这是canInitWithRequestNSURLProtocol

+ (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但是当登录请求被调用时,我在日志中得到这个错误:

错误域=NSURLErrorDomain 代码=-1004 “无法连接到服务器。”

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

4

2 回答 2

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, 那是防御性编码。

于 2015-02-16T15:39:33.293 回答
0

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

进去看看startLoading。检查 URL 的绝对字符串。确保您缓存的那个与您现在请求的那个完全相同。如果您在 URL 中放置任何可更改的数据,那么它将不匹配。

我刚刚注意到,我认为我已经在这段代码中修复的许多小问题实际上是待处理的拉取请求。所以我现在已经合并了大部分。特别是,我散列 URL 的方式很容易发生冲突。那是固定的。并且更新后的代码增加了对非 http 的支持。(但您的错误仍然表明 URL 不匹配。)

于 2015-02-16T16:02:51.350 回答