2014-09-20 118 views
2

我使用okhttp和改造調用REST服務。從該服務返回的數據存儲在我的Android應用程序內的一個SQLite數據庫。當我調用REST api時,如果數據沒有改變(由ETag或Last-Modified頭確定),我想讓Retrofit回調不做任何事(數據在DB中是OK的)。否則,我想從REST服務下載更新的JSON並更新數據庫(通過我的回調的onSuccess方法)。在okhttp我想處理Last-Modified和ETag的,但沒有緩存整個響應

在緩存中的所有設置磁盤緩存的響應的okhttp例子,我只需要緩存/存儲每個請求(而不是整個響應)的eTag /最後一次修改時間。

我應該通過自定義緩存實現時,我傳遞給okhttp這樣做,或是否有更好的界面,我應該用okhttp或改造使用?

一旦我有了執行安裝程序,我只需要在我的onFailure回調中處理304「錯誤」,什麼都不做?

+0

沒有內置的將會做到這一點。 OkHttp沒有響應返回,它總是一個響應和標題。 – 2014-09-21 05:48:54

+0

謝謝Jesse的迴應,替代解決方案是檢查響應是來自磁盤還是網絡,只處理來自網絡的響應(即更新數據庫)?我不想一遍又一遍地解析相同的JSON。或者我更好地實現自己的緩存,但該緩存只存儲「」,而不是完整的響應頭(而爲了節省空間)? – 2014-09-21 05:57:32

+0

@JesseWilson我想用OkHttp3你的評論不再是真的?您從https://square.github.io/okhttp/3.x/okhttp/okhttp3/Response.html#networkResponse獲得的代碼應該涵蓋此否? – 2016-10-03 11:42:00

回答

4

要知道,如果你有一個304的響應,在onResponse回調你可以捕捉它,如下所示:

if (response.raw().networkResponse().code() == 304){ 
    // Do what you want to do 
} 

至少,這是當你使用的是改造2和okHttp 3.不確定關於早期版本,但我想它會是一樣的?在響應中設置斷點時,您總是可以嘗試查找304響應。

+0

我認爲這應該是被接受的答案。它似乎也適用於我。 – 2016-10-03 11:38:21

+1

下面的文章給出了答案的更長的解釋,但上面的代碼是正確的。 https://medium.com/@ffvanderlaan/reducing-your-networking-footprint-with-okhttp-etags-and-if-modified-since-b598b8dd81a1 – 2017-03-20 00:25:14