这是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 ,但是当调用登录请求时,我在日志中收到此错误:
错误域名= NSURLErrorDomain代码= -1004"无法连接到服务器。"
但是,如果我删除了canInitWithRequest
中 https 的检查,我就不会收到任何错误。
我正在使用RNCachingURLProtocol来缓存请求
我怎样才能做到这一点。
答案 0 :(得分: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
,即防御性编码。
答案 1 :(得分:0)
"无法连接到服务器"意味着您已离线,但在缓存中找不到您请求的网址。
查看startLoading
。检查URL的绝对字符串。确保您缓存的那个与您现在请求的那个完全相同。如果您在网址中添加了任何可更改的数据,那么它就不会匹配。
我刚刚注意到,我认为我在此代码中修复的许多小问题实际上是待处理的拉请求。 So I've merged most of those now.特别是,我的哈希URL方式非常容易发生冲突。那是固定的。更新后的代码增加了对非http的支持。 (但是您的错误仍然表明网址不匹配。)