我正在使用以下代碼從TfL下載一些數據。NSURLCache無視max-age
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];
的效應初探的Cache-Control頭場public, must-revalidate, max-age=5, s-maxage=10
這似乎意味着服務器將發送即使第二請求是由最大年齡給出的5秒內的請求。如果我使用Charles來編輯響應並刪除必須重新驗證,那麼上面的代碼只會向服務器發送一次請求。
的HTTP/1.1規範說
,它變得陳舊,而無需先與原始服務器重新驗證它的 後續請求響應後緩存絕不能使用的條目。
對於must-revalidate
,然而它似乎iOS似乎忽略了「後它變成陳舊」的一部分?並且需要must-revalidate
意味着忽略最大年齡。那麼如何將字段設置爲完全不緩存呢?我已經檢查並且請求/響應正在被添加到緩存中,所以它似乎只是膨脹了緩存,因爲它不會使用它,但仍將其添加到緩存中?
因此,服務器不正確,因爲must-revalidate
與max-age
結合在一起,或者iOS處理方式不正確must-revalidate
?
是否有攔截響應的方式,以便我可以刪除must-revalidate
? NSURLProtocol似乎可能是有用的,但我只能看到如何修改請求,而不是響應。