我正在创建一个使用 OkHttp 网络库作为 HTTP 客户端的 Android 应用程序。我共享一个OkHttpClient
缓存大小为 10 MB 的实例。流程是:我向服务器发送请求,服务器对其进行处理并生成ETag
标头,OkHttp 应该将其If-None-Match
连接到以下对同一 URL 的请求中的标头中。问题是If-None-Match
请求的标头中缺少标头,因此Response.cacheResponse()
总是返回null
. 所以我的问题是:如何解决这个问题以使用响应缓存?
OkHttpClientSingleton.java:
public class OkHttpClientSingleton
{
private static OkHttpClientSingleton sOkHttpClientSingleton;
private OkHttpClient mOkHttpClient;
public static OkHttpClientSingleton get(Context context)
{
if(sOkHttpClientSingleton == null)
{
sOkHttpClientSingleton = new OkHttpClientSingleton(context);
}
return sOkHttpClientSingleton;
}
public OkHttpClientSingleton(Context context)
{
int cacheSize = 10 * 1024 * 1024;
Cache cache = new Cache(context.getCacheDir(), cacheSize);
mOkHttpClient = new OkHttpClient.Builder()
.cache(cache)
.addNetworkInterceptor(new LoggingInterceptor())
.build();
}
public void addRequest(Request request, Callback responseCallback, ProgressDialog progressDialog)
{
if(progressDialog != null && !progressDialog.isShowing())
progressDialog.show();
mOkHttpClient.newCall(request).enqueue(responseCallback);
}
}
发送请求代码片段:
RequestBody formBody = new FormBody.Builder()
.add("data", data)
.build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
Callback responseCallback = new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
// Do something
}
@Override
public void onResponse(Call call, Response response)
{
dismissProgressDialog();
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
Response cacheResponse = response.cacheResponse(); // Always null
if(response.isSuccessful())
{
if(response.code() == 200)
{
// Deserialize json using gson
}
}
else
{
if(response.code() == 400)
{
// Deserialize json using gson
}
}
}
};
OkHttpClientSingleton.get(getContext()).addRequest(request, responseCallback, getProgressDialog());
可以在此处查看来自网络拦截器的两个相同请求的日志。
我在互联网上发现了很多类似的问题,但没有一个能帮助我解决这个问题。
任何帮助将非常感激。