【发布时间】:2016-02-09 15:29:22
【问题描述】:
我正在使用以下代码从 TfL 下载一些数据。
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.tfl.gov.uk/StopPoint/490012211N/Arrivals"]];
[[session dataTaskWithRequest:req
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSLog(@"Loaded Succesfully");
}
NSCachedURLResponse *resp = [[NSURLCache sharedURLCache] cachedResponseForRequest:req];
if (resp) {
NSLog(@"Response in cache");
}
[[session dataTaskWithRequest:req
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSLog(@"Loaded Sucessfully again");
}
}] resume];
}] resume];
reponse 的 cache-control 头域是public, must-revalidate, max-age=5, s-maxage=10 这似乎意味着即使第二个请求在 max-age 给定的 5 秒内,服务器也会发送请求。如果我使用 Charles 编辑响应并删除 must-revalidate,那么上面的代码只会向服务器发送一次请求。
HTTP/1.1 规范说
该缓存在条目变得陈旧后不得使用该条目来响应 后续请求,而无需先使用源服务器重新验证它。
对于must-revalidate,但似乎 iOS 似乎忽略了“在它变得陈旧之后”部分?并采用must-revalidate 表示忽略最大年龄。那么与将字段设置为根本不缓存有何不同。我检查了请求/响应正在添加到缓存中,所以看起来must-revalidate 只是膨胀缓存,因为它永远不会使用它,但仍将其添加到缓存中?
那么服务器是否不正确地将must-revalidate 与max-age 结合使用,或者iOS 处理must-revalidate 的方式不正确?
有没有办法拦截响应以便我可以删除must-revalidate? NSURLProtocol 似乎很有用,但我只能看到如何修改请求,而不是响应。
【问题讨论】:
标签: ios objective-c nsurlsession cache-control nsurlcache