Достаточно ли для вашего случая использования просто HTTP-кеширования? Цель HTTP-кеширования не только в том, чтобы предоставить способ не делать запросы, если у вас уже есть свежий ответ, но и в том, чтобы вы могли быстро проверить, является ли ответ, который у вас уже есть в кеше, действительным (без отправки сервером полного ответа). ответ еще раз, если он свежий).
Глядя на ответы API GitHub, я вижу, что GitHub правильно устанавливает соответствующие заголовки HTTP (ETag, Last-modified, Cache-control).
Итак, вы просто выполняете GET, например. для:
GET https://api.github.com/users/izuzak/repos
и это возвращается:
200 OK
...
ETag:"df739f00c5053d12ef3c625ad6b0fd08"
Last-Modified:Thu, 14 Feb 2013 22:31:14 GMT
...
В следующий раз вы выполняете GET для того же ресурса, но также предоставляете соответствующие заголовки HTTP-кеширования, так что на самом деле это условный GET:
GET https://api.github.com/users/izuzak/repos
...
If-Modified-Since:Thu, 14 Feb 2013 22:31:14 GMT
If-None-Match:"df739f00c5053d12ef3c625ad6b0fd08"
...
И о чудо - сервер возвращает ответ 304 Not modified, и ваш HTTP-клиент вытащит ответ из своего кеша:
304 Not Modified
Итак, GitHub API правильно выполняет кеширование HTTP, и вы должны его использовать. Конечно, вы должны использовать HTTP-клиент, который также поддерживает HTTP-кеширование. Лучше всего то, что если вы получите ответ 304 Not modified - GitHub не уменьшит вашу оставшуюся квоту вызовов API. См. https://docs.github.com/en/rest/overview/resources-in-the-rest-api#conditional-requests
GitHub API также устанавливает заголовок Cache-Control: private, max-age=60
, поэтому у вас есть 60 секунд свежести - это означает, что запросы одного и того же ресурса, сделанные с интервалом менее 60 секунд, даже не будут отправлены на сервер.
Ваше рассуждение об использовании одного условного запроса GET к ресурсу, который обязательно изменится, если что-то в репо изменилось (например, ресурс, показывающий sha HEAD), звучит разумно - поскольку, если этот ресурс не изменился, вы не Нет необходимости проверять отдельные файлы, поскольку они точно не изменились.
person
Ivan Zuzak
schedule
15.02.2013