2013-12-10 74 views
3

我正在使用AFNetworking 1.3.3從Amazon S3中獲取靜態JSON文件。如果我使用Google Chrome請求這些文件並檢查標題,它會在請求中發送一個If-Modified-SinceIf-None-Match HTTP標頭,並且您會收到一個很好的304響應。AFNetworking請求中忽略If-Modified-Since或If-None-Match標頭

但是,當我使用AFNetworking發送相同的請求時,發送相同的If-Modified-Since和相同的If-None-Match標題,我每次都得到200,即使我知道內容未被修改。它似乎忽略了我發送的額外頭文件。

這裏是我的代碼:

NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:feedUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60]; 

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

if (feed.remoteLastModified != nil) { 
    // In real life I use the last modified header returned by the request 
    [request setValue:@"Tue, 10 Dec 2013 07:15:50 GMT" forHTTPHeaderField:@"If-Modified-Since"]; 
} 

if (feed.remoteETag.length > 0) { 
    NSLog(@"If-None-Match: %@", feed.remoteETag); 
    [request setValue:feed.remoteETag forHTTPHeaderField:@"If-None-Match"]; 
} 

NSLog(@"headers: %@", request.allHTTPHeaderFields); 

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest* request, NSHTTPURLResponse* response, id JSON) { 

    NSLog(@"Status code: %d", response.statusCode);   

} failure:^(NSURLRequest* request, NSHTTPURLResponse* response, NSError* error, id JSON) { 
    if (response.statusCode != 304) { 
     NSLog(@"There was an error: %@", [error userInfo]); 
    } else { 
     NSLog(@"Not modified"); 
    } 
}]; 

[operation start]; 

回答

6

的問題是使用的緩存策略 - 與NSURLRequestUseProtocolCachePolicy NSURLCache會做幕後了自己的高速緩存,並透明地與原來的200響應返回緩存的結果。

如果您確實想自己執行緩存,請使用NSURLRequestReloadIgnoringLocalCacheData緩存策略。這並不意味着它會忽略你的緩存頭(我原來的想法) - 這只是意味着NSURLCache將忽略它自己的本地緩存。

但是,自己這樣做並重新發明輪子可能是錯誤的方法!