面试题答案
一键面试关键的HTTP头字段
- Cache-Control:
- max - age:指定响应可以被缓存的最长时间,单位为秒。例如
Cache - Control: max - age=3600
,表示该响应可以被缓存1小时。 - no - cache:表示强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证),但响应仍可被缓存。
- no - store:表示禁止缓存任何关于客户端请求或服务器响应的内容,每次都要向服务器重新请求数据。
- max - age:指定响应可以被缓存的最长时间,单位为秒。例如
- Expires:指定一个绝对的过期时间,在这个时间之后,响应将被认为过期。例如
Expires: Thu, 01 Dec 2022 16:00:00 GMT
。但它是一个较老的机制,优先级低于Cache - Control
。
Flutter代码实现
- 发送网络请求并获取响应:
使用
http
库来发送网络请求。
import 'package:http/http.dart' as http;
Future<http.Response> fetchData() async {
final response = await http.get(Uri.parse('YOUR_API_URL'));
return response;
}
- 解析HTTP头字段:
从响应头中获取
Cache - Control
和Expires
字段。
void parseHeaders(http.Response response) {
final cacheControl = response.headers['cache - control'];
final expires = response.headers['expires'];
// 解析max - age
if (cacheControl != null) {
final parts = cacheControl.split(', ');
for (var part in parts) {
if (part.startsWith('max - age=')) {
final maxAge = int.tryParse(part.split('=')[1]);
if (maxAge != null) {
// 这里可以根据maxAge进行缓存逻辑处理
}
}
}
}
// 解析Expires字段
if (expires != null) {
try {
final expirationDate = DateTime.parse(expires);
// 这里可以根据expirationDate进行缓存逻辑处理
} catch (e) {
// 处理日期解析错误
}
}
}
- 利用缓存头实现缓存策略:
结合
Cache - Control
和Expires
字段的值,实现简单的缓存策略。例如,根据max - age
判断缓存是否过期。
class NetworkCache {
Map<String, http.Response> cache = {};
Map<String, DateTime> cacheExpiry = {};
Future<http.Response> getWithCache(String url) async {
if (cache.containsKey(url) &&
cacheExpiry.containsKey(url) &&
cacheExpiry[url]!.isAfter(DateTime.now())) {
return cache[url]!;
}
final response = await fetchData();
cache[url] = response;
final cacheControl = response.headers['cache - control'];
if (cacheControl != null) {
final parts = cacheControl.split(', ');
for (var part in parts) {
if (part.startsWith('max - age=')) {
final maxAge = int.tryParse(part.split('=')[1]);
if (maxAge != null) {
cacheExpiry[url] = DateTime.now().add(Duration(seconds: maxAge));
}
}
}
}
return response;
}
}
在实际应用中,可以将上述代码整合并优化,以适应具体的业务需求。同时,还可以结合flutter_cache_manager
等库来更方便地实现和管理网络缓存。