2013-01-03 8 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 - OKを受け取るべきです。

コード304 - 変更されていないため、取得できませんでした。私は速くて遅いコマンドを数回実行しようとしましたが、私は常に応答として200を得ます。

レスポンスコードとして304が得られたときに詳細がありますか?

304レスポンスコードは、一般的にコンテンツが変更されていないことを意味し、レスポンスとして200件のオリジナルリクエストが必要です。

ここであなたがたEtagについて少し詳細を読むことができます:ETag vs Header Expires

+0

これは、私が直面していることです、ランダム304.私は依頼で正しいEtagを送信しているときに、なぜ私は200を得るのかわかりません。より混乱しているのは、コードがwikiのURLに完全に対応しているということです。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だけを実装しています。 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もOKです –

0

に私の要求を変更することでこの問題を解決するために管理し、私はまたのEtagとの問題を抱えていましたロジックとAFNetworking。私の問題は、私はそれが誰かを助けることを願っ正しく

...

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: {})) 
を設定するだけでなく、 cachePolicyでした!

関連する問題