使用 okhttp3 检查和恢复缓存文件
Check and recover a cached file with okhttp3
我正在使用 okhttp3 向服务器发出请求,而不是使用改造。
我的想法是拨打电话并将响应保存在缓存中 15 分钟。
如果在这 15 分钟内,再次请求,恢复缓存响应,15 分钟后,再次向服务器请求。
这是我的代码:
public class Handler_JSON_get {
public Handler_JSON_get() {
}
public String makeServiceCall(String url, JSONObject data) {
final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
Cache cache = new Cache(new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/MY_PACKAGE/", "cache"), 10 * 1024 * 1024);
OkHttpClient okHttpClient;
Log.i("2134","Usando caché");
okHttpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(provideCacheInterceptor())
.readTimeout(45, TimeUnit.SECONDS)
.protocols(Arrays.asList(Protocol.HTTP_1_1))
.addInterceptor(provideCacheInterceptor())
.cache(cache)
.build();
Request request = new Request.Builder()
.url(url)
.get()
.build();
try {
Response response = okHttpClient.newCall(request).execute();
Log.i(TAG,"Response:"+response.code());
return response.body().string();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
Interceptor provideCacheInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(15, TimeUnit.MINUTES)
.build();
return response.newBuilder()
.header("cache", cacheControl.toString())
.build();
}
};
}
}
问题是他总是调用服务器,我有很多疑惑。
okhttp3 负责查看存储中是否有缓存的响应?
调用保存了一个日志文件,这是正确的文件吗?
我错过了什么或者我做错了什么?
我看到有很多关于它的问题,但我无法使这些答案与我的代码兼容。
我真诚地感谢我的代码中正常运行所必需的部分,我开始发疯了。
提前致谢。
我花了一些时间才发现它:正确的 header 名称是 Cache-Control
,而不是 cache
:
return response.newBuilder()
.header("Cache-Control", cacheControl.toString())
.build();
另外拦截器好像加addNetworkInterceptor
就够了,没必要加addInterceptor
我正在使用 okhttp3 向服务器发出请求,而不是使用改造。 我的想法是拨打电话并将响应保存在缓存中 15 分钟。 如果在这 15 分钟内,再次请求,恢复缓存响应,15 分钟后,再次向服务器请求。
这是我的代码:
public class Handler_JSON_get {
public Handler_JSON_get() {
}
public String makeServiceCall(String url, JSONObject data) {
final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
Cache cache = new Cache(new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/MY_PACKAGE/", "cache"), 10 * 1024 * 1024);
OkHttpClient okHttpClient;
Log.i("2134","Usando caché");
okHttpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(provideCacheInterceptor())
.readTimeout(45, TimeUnit.SECONDS)
.protocols(Arrays.asList(Protocol.HTTP_1_1))
.addInterceptor(provideCacheInterceptor())
.cache(cache)
.build();
Request request = new Request.Builder()
.url(url)
.get()
.build();
try {
Response response = okHttpClient.newCall(request).execute();
Log.i(TAG,"Response:"+response.code());
return response.body().string();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
Interceptor provideCacheInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(15, TimeUnit.MINUTES)
.build();
return response.newBuilder()
.header("cache", cacheControl.toString())
.build();
}
};
}
}
问题是他总是调用服务器,我有很多疑惑。
okhttp3 负责查看存储中是否有缓存的响应?
调用保存了一个日志文件,这是正确的文件吗?
我错过了什么或者我做错了什么?
我看到有很多关于它的问题,但我无法使这些答案与我的代码兼容。
我真诚地感谢我的代码中正常运行所必需的部分,我开始发疯了。
提前致谢。
我花了一些时间才发现它:正确的 header 名称是 Cache-Control
,而不是 cache
:
return response.newBuilder()
.header("Cache-Control", cacheControl.toString())
.build();
另外拦截器好像加addNetworkInterceptor
就够了,没必要加addInterceptor