使用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做网络缓存,看完本文想必你已经知道,很简单对吧
推荐阅读