AFNetworking - 使用ETag的请求
我正尝试在服务器上执行请求,使用Etag进行响应以实现缓存目的。我已经为它写了下面的代码,但是这些调用的响应在大多数时间是随机的,即有时响应状态代码是200,有时候是304(预期)。我在代码中做错了什么,或者是否有AFNetworking特有的东西,我应该记住。AFNetworking - 使用ETag的请求
NSURL *url = [NSURL URLWithString:@"http://ia.media-imdb.com/images/M/[email protected]@._V1._SY90_.jpg"];
NSMutableURLRequest *aRequest = [NSMutableURLRequest requestWithURL:url];
[aRequest setValue:@"\"61-smtLpBSL_SY90_#1\"" forHTTPHeaderField:@"If-None-Match"];
NSLog(@"headers: %@", aRequest.allHTTPHeaderFields);
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:aRequest imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
NSLog(@"%@ %d", response.allHeaderFields, response.statusCode);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Request failed with error: %@", error);
}];
[operation start];
我已经试过你的代码,我收到状态200-确定这是它应该是。
代码304 - 没有修改,我没有得到。我尝试了几次快速和慢速的运行命令,但我总是得到200作为回应。
你是否有更多的细节什么时候发生,你得到304作为响应代码?
304响应代码通常表示内容未被修改,您应该获得原始请求,其中包含200作为响应。
在这里你可以看到多一点的Etag:ETag vs Header Expires
这就是我面临的一个随机304.我仍然不确定为什么当我在请求中发送正确的Etag时,我会得到200。更令人困惑的是,这些代码完全可以在wiki urls上运行,例如:http://upload.wikimedia.org/wikipedia/en/2/27/AScannerDarkly%281stEd%29.jpg参考:[w3.org](http: //www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) –
另外,我正在使用的服务器团队只实现了Etag。他们不发送资源创建的HTTP日期,因此不能使用Expires标头。 –
我有同样的问题,我设法改变我的要求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:60];
cachePolicy未实现。 枚举{ NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,//未实现 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadRevalidatingCacheData = 5,//未实现 }; typedef NSUInteger NSURLRequestCachePolicy; –
谢谢,缓存策略是问题。无论默认策略是什么导致我的etag被忽略。 –
NSURLRequestReloadIgnoringLocalCacheData也可以 –
解决这个问题我也有跟的eTag问题逻辑和AFNetworking。我的问题是只是cachePolicy
设置不正确......
var manager = AFHTTPRequestOperationManager()
manager.requestSerializer = AFHTTPRequestSerializer()
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
manager.requestSerializer.setValue(etag, forHTTPHeaderField: "If-None-Match")
manager.GET(fullPath, parameters: parameters, success: {}, failure: {}))
我希望这会帮助别人!
你有没有深入到底? – andygeers