2013-01-03 46 views
5

我正尝试在服务器上执行请求,使用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]; 
+2

你有没有深入到底? – andygeers

回答

0

我已经试过你的代码,我收到状态200-确定这是它应该是。

代码304 - 没有修改,我没有得到。我尝试了几次快速和慢速的运行命令,但我总是得到200作为回应。

你是否有更多的细节什么时候发生,你得到304作为响应代码?

304响应代码通常表示内容未被修改,您应该获得原始请求,其中包含200作为响应。

在这里你可以看到多一点的Etag:ETag vs Header Expires

+0

这就是我面临的一个随机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) –

+0

另外,我正在使用的服务器团队只实现了Etag。他们不发送资源创建的HTTP日期,因此不能使用Expires标头。 –

4

我有同样的问题,我设法改变我的要求

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString] 
                   cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
                  timeoutInterval:60]; 
+0

cachePolicy未实现。 枚举{ NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,//未实现 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadRevalidatingCacheData = 5,//未实现 }; typedef NSUInteger NSURLRequestCachePolicy; –

+0

谢谢,缓存策略是问题。无论默认策略是什么导致我的etag被忽略。 –

+0

NSURLRequestReloadIgnoringLocalCacheData也可以 –

0

解决这个问题我也有跟的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: {})) 

我希望这会帮助别人!