在AppDelegate.m中,我进行了配置:
然后是http请求:
第一次请求时,它获得了带有Etag和Cache-Control头的HTTP 200。没有问题。 如果我没错的话,
但事实并非如此,第二次发出http请求时,实际上会发送
我搜索了一天以上类似问题的谷歌结果,其他人也遇到了相似的问题,但我没有找到任何解决方案。有些人在AFNetworking的github问题中问了同样的问题,但作者关闭了该问题,因为它与AFNetworking无直接关系(这里)和(这里)。
此外,各种相关的stackoverflow帖子对我也没有帮助。
NSURLCache *sharedURLCache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 diskCapacity:100 * 1024 * 1024 diskPath:@"FhtHttpCacheDir"];
然后是http请求:
- (void) testRestfulAPI{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://192.168.0.223:8000/v1/topictypes"]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
NSError *error = nil;
if (!error) {
NSURLSessionDataTask *downloadTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
if (httpResp.statusCode == 200) {
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data
options:kNilOptions
error:&error];
NSLog(@"JSON: %@", json);
}
}
}];
[downloadTask resume];
}
}
第一次请求时,它获得了带有Etag和Cache-Control头的HTTP 200。没有问题。 如果我没错的话,
Cache-Control: must-revalidate, max-age=86400, private
会告诉NSURLCache在24小时内将缓存视为新鲜,并且在接下来的24小时内不会进行任何网络调用。但事实并非如此,第二次发出http请求时,实际上会发送
If-None-Match
头,并收到HTTP 304响应。
我觉得NSURLCache部分工作正常。它可以缓存响应,但不遵循苹果文档中描述的RFC 2616语义(这里)。请注意,我没有更改缓存策略,因此使用默认的NSURLRequestUseProtocolCachePolicy
。我搜索了一天以上类似问题的谷歌结果,其他人也遇到了相似的问题,但我没有找到任何解决方案。有些人在AFNetworking的github问题中问了同样的问题,但作者关闭了该问题,因为它与AFNetworking无直接关系(这里)和(这里)。
此外,各种相关的stackoverflow帖子对我也没有帮助。
sharedURLCache
,但从未使用过它... - Mihai Fratu