2013-01-03 15 views
5

Próbuję wykonać żądanie na serwerze, który odpowiada za pomocą Etag dla celów pamięci podręcznej. Napisałem dla niego poniższy kod, ale odpowiedź na te połączenia jest losowa przez większość czasu, tj. Czasami kod stanu odpowiedzi to 200, a czasem 304 (oczekiwany). Czy robię coś nie tak w moim kodzie lub czy jest coś szczególnego w AFNetworking, o którym powinienem pamiętać?!AFNetworking - Żądania z 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

Czy kiedykolwiek doszedłeś do sedna tego? – andygeers

Odpowiedz

0

Próbowałem swój kod i otrzymać status 200 - OK, która jest jak powinno być.

Kod 304 - Nie zmodyfikowany, nie udało mi się uzyskać. Próbowałem kilka razy uruchamiać polecenia szybko i powoli, ale zawsze otrzymuję 200 odpowiedzi.

Czy masz więcej informacji, kiedy dokładnie się stanie, że otrzymasz kod 304 jako odpowiedź?

Kod odpowiedzi 304 oznacza, że ​​treść nie została zmodyfikowana i powinieneś otrzymać oryginalne żądanie, które zawierało 200 odpowiedzi.

Tutaj można przeczytać nieco więcej o wytycznych: ETag vs Header Expires

+0

Oto, co mam na myśli, przypadkowy 304. Wciąż nie jestem pewien, dlaczego dostanę 200, gdy wysyłam prawidłowy Etag w żądaniu.! Najgorszą rzeczą jest to, że kod działa idealnie na adresy stron wiki, takie jak: http://upload.wikimedia.org/wikipedia/en/2/27/AScannerDarkly%281stEd%29.jpg Referencje: [w3.org] (http: //www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) –

+0

Również zespół serwerów, z którym pracuję, zaimplementował tylko Etag. Nie wysyłają daty HTTP dla tworzenia zasobów, więc nie mogą używać nagłówka Expires. –

4

miałem ten sam problem, udało mi się rozwiązać ten problem poprzez zmianę moją prośbę do

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

Ta właściwość cachePolicy nie jest zaimplementowana. wyliczenia { NSURLRequestUseProtocolCachePolicy = 0 NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4 // Niezaimplementowane NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadRevalidatingCacheData = 5 // Niezaimplementowane }; typedef NSUInteger NSURLRequestCachePolicy; –

+0

Dzięki, problem dotyczył zasad pamięci podręcznej. Niezależnie od zasad domyślnych moja etyka zostanie zignorowana. –

+0

NSURLRequestReloadIgnoringLocalCacheData też jest w porządku –

0

Miałem też problem z ETAG logika i AFNetworking. Mój problem był tylko cachePolicy nieprawidłowo ...

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: {})) 

Mam nadzieję, że komuś pomóc!