【问题标题】:AFNetworking - Requests with ETagAFNetworking - 带有 ETag 的请求
【发布时间】:2012-12-17 12:56:00
【问题描述】:

我正在尝试在服务器上发出请求,该服务器以 Etag 进行响应以用于缓存目的。我为它编写了以下代码,但这些调用的响应大部分时间是随机的,即有时响应状态代码是 200,有时是 304(预期)。我是在代码中做错了什么,还是我应该记住 AFNetworking 的某些特定内容。!

  NSURL *url = [NSURL URLWithString:@"http://ia.media-imdb.com/images/M/MV5BNzI0NTY5NzQwMV5BMl5BanBnXkFtZTcwOTQyNTA5OA@@._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];

【问题讨论】:

  • 你有没有深究过这个?

标签: objective-c ios afnetworking


【解决方案1】:

我遇到了同样的问题,我设法通过将我的请求更改为来解决这个问题

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

【讨论】:

  • 那个 cachePolicy 没有实现。 enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // 未实现 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadReval typedef NSUInteger NSURLRequestCachePolicy;
  • 谢谢,缓存策略是问题所在。无论默认策略是什么导致我的 etag 被忽略。
  • NSURLRequestReloadIgnoringLocalCacheData 也可以
【解决方案2】:

我已经尝试了您的代码,我收到了状态 200 - 好的,应该是这样。

代码 304 - 未修改,我无法获取。我已经尝试过几次快速和慢速运行命令,但我总是得到 200 作为响应。

当您收到 304 作为响应代码时,您是否有更多详细信息?

304 响应码通常表示内容没有被修改,您应该得到包含 200 作为响应的原始请求。

您可以在这里阅读更多关于 Etag 的信息:ETag vs Header Expires

【讨论】:

  • 这就是我所面临的,一个随机的 304。我仍然不确定当我在请求中发送正确的 Etag 时为什么会得到 200。!更令人困惑的是代码在 wiki url 上完美运行,例如:upload.wikimedia.org/wikipedia/en/2/27/… 参考:w3.org
  • 另外,与我合作的服务器团队只实现了 Etag。他们不发送用于创建资源的 HTTP 日期,因此不能使用 Expires 标头..
【解决方案3】:

我也遇到了 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: {}))

希望对大家有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多