サーバーがリクエストのEtagIf-None-Match
を返し、その etag が後続のすべての URL リクエストにヘッダー (つまり) として追加されるという単純な使用例があります。サーバーは200
、応答に変更がある場合、または304
それ以外の場合に応答できます。後者の場合、キャッシュからの応答を再利用することは理にかなっています。ただし、okhttp は常にnull
キャッシュされた応答として返されます。
トラブルシューティングを行ったところ、応答は okhttp によって内部的にディスクに書き込まれますが、CachingStrategy
はそれを に返しませんCacheInterceptor
。CachingStrategy
クラスを詳しく調べると、キャッシュが使用されないことを具体的に述べているドキュメントがあります。
/**
* Returns true if the request contains conditions that save the server from sending a response
* that the client has locally. When a request is enqueued with its own conditions, the built-in
* response cache won't be used.
*/
private fun hasConditions(request: Request): Boolean =
request.header("If-Modified-Since") != null || request.header("If-None-Match") != null
}
この動作を回避し、代わりにキャッシュされた応答を使用する方法はありますか?
(ここで説明されているようにキャッシュを有効にしており、okhttp バージョンを使用しています3.10.0
)
また、奇妙なことに、Etag を手動で追加する必要があります。Okhttp は、それ自体で後続のリクエストに etag を追加できません。
編集- 修正、Okhttp は etag ヘッダーを正しく追加します。後続のリクエストに etag ヘッダーが追加されていることを確認するには、ネットワーク インターセプターと通常のインターセプターを使用する必要がありました。
これらの問題に多少関連しています: