欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用ETag做网络缓存实践总结

程序员文章站 2022-03-11 16:34:19
...

导语:App启动时,通常会更新一些配置文件,有的配置信息文件比较大,如果每次都去更新,这是即耗时又浪费流量的操作,我们希望的是后台配置文件更新了,App就去下载最新配置文件,后台配置文件没有更新,就不去下载配置文件,这样的缓存模块该如何设计呢?且看本文总结

1.什么是ETag?

ETag,即Entity Tag,HTTP协议定义ETag为“被请求变量的实体值”,它是一个 hash 值,每一个资源文件都对应一个唯一的ETag 值。总结一下,ETag变化了,即表明目标资源文件变化了。

2.如何使用ETag?

先看一段简单的代码:

//配置文件URL为configURL,本地缓存Etag,可以获取configURL对应ETag
NSString *cachedETag = [self ETagForURL:configURL];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:configURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15];
//在请求头中加入ETag
if (cachedETag.length) {
  [request setValue:cachedETag forHTTPHeaderField:@"If-None-Match"];
}
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
  if (httpResponse.statusCode == 304) {
     //ETag没有变化,后台返回304
     return;
  }
  NSString *newETag = httpResponse.allHeaderFields[@"Etag"];
  [self saveETag:newETag forURL:configURL];
  [self saveData:data forURL:configURL];
}] resume];

通过代码,可以看到在发起请求时request会带上之前缓存文件对应的ETag,http服务器拿到客户端上传的ETag与资源文件ETag进行比较,如果一样,则返回304,data大小为0,即不下载配置。如果ETag不一样,返回最新的Etag和最新资源。

如何使用ETag做网络缓存,看完本文想必你已经知道,很简单对吧