2013-01-03 12 views
5

Sto tentando di eseguire una richiesta su un server, che risponde con un Etag ai fini della cache. Ho scritto il seguente codice per questo, ma la risposta per queste chiamate è casuale la maggior parte del tempo, ad esempio il codice di stato a volte di risposta è 200 e alcune volte 304 (previsto). Sto facendo qualcosa di sbagliato nel mio codice o c'è qualcosa di specifico con AFNetworking che dovrei tenere a mente.!AFNetworking - Richieste con 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

Sei mai arrivato in fondo a questo? – andygeers

risposta

0

Ho provato il codice e ottengo lo stato 200 - OK, che è come dovrebbe essere.

Codice 304 - Non modificato, non sono riuscito a ottenere. Ho provato a eseguire il comando più volte in modo rapido e lento, ma ottengo sempre 200 come risposta.

Avete ulteriori dettagli quando accade esattamente che si ottiene 304 come codice di risposta?

304 codice di risposta significa in genere che il contenuto non è stato modificato ed è necessario ottenere la richiesta originale che conteneva 200 come risposta inclusa.

Qui potete leggere un po 'di più su Etag: ETag vs Header Expires

+0

Questo è quello che sto affrontando, un 304 casuale. Non sono ancora sicuro del perché avrei ottenuto un 200 quando invio l'Etag corretto nella richiesta.! La cosa più confusa è che il codice funziona perfettamente su URL wiki come: http://upload.wikimedia.org/wikipedia/en/2/27/AScannerDarkly%281stEd%29.jpg Riferimento: [w3.org] (http: //www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) –

+0

Inoltre, il team del server con cui sto lavorando ha implementato solo Etag. Non inviano una data HTTP per la creazione di risorse, quindi non possono utilizzare l'intestazione Expires .. –

4

Ho avuto lo stesso problema, sono riuscito a risolvere il problema cambiando la mia richiesta di

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

Quella cachePolicy non è implementata. enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented }; typedef NSUInteger NSURLRequestCachePolicy; –

+0

Grazie, la politica della cache era il problema. Qualunque sia la politica di default, il mio etag è stato ignorato. –

+0

NSURLRequestReloadIgnoringLocalCacheData è OK, anche –

0

Ho anche avuto un problema con l'Etag logica e AFNetworking. Il mio problema era solo il cachePolicy non impostato correttamente ...

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

spero che aiutare qualcuno!