Кэширование вызовов Github API
У меня есть общий вопрос, связанный с кэшированием вызовов API, в данном случае вызовов API Github.
Допустим, у меня в приложении есть страница, которая показывает имена файлов репо и содержимое README. Это означает, что мне придется сделать несколько вызовов API, чтобы получить это.
Теперь, скажем, я хочу добавить что-то вроде memcached между ними, так что я не буду делать эти вызовы снова и снова, если мне это не нужно.
Как бы вы обычно поступили по этому поводу? Если я не включу веб-крючок на Github, у меня не будет возможности узнать, истекает ли срок действия кэша. Я всегда мог сделать один вызов для получения текущего шага HEAD, и если он не изменился, используйте вместо этого кеш. Но это на уровне репо, а не на уровне файлов.
Я могу себе представить, что я мог бы сделать что-то подобное с объектами-ша, но если мне все равно нужно вызвать API, чтобы получить их, это побеждает цель кэширования.
Как бы вы пошли об этом? Я знаю, что такой сервис, как prose.io, сейчас не имеет кэширования, но если это так, каким будет подход?
Спасибо
1 ответ
Будет ли достаточно просто использовать HTTP-кэширование для вашего случая использования? Целью HTTP-кэширования является не просто предоставление способа не делать запросы, если у вас уже есть свежий ответ, скорее, оно также позволяет вам быстро проверить, является ли ответ, который у вас уже есть в кэше, действительным (без того, чтобы сервер отправлял полный запрос). Ответ снова, если он свежий).
Глядя на ответы API GitHub, я вижу, что GitHub правильно устанавливает соответствующие заголовки HTTP (ETag, Last-updated, 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 Не изменен, и ваш HTTP-клиент извлечет ответ из своего кэша:
304 Not Modified
Итак, GitHub API выполняет HTTP-кэширование правильно, и вы должны его использовать. Конечно, вы должны использовать HTTP-клиент, который также поддерживает HTTP-кэширование. Лучше всего то, что если вы получите 304 Не измененный ответ - GitHub не уменьшит вашу оставшуюся квоту вызовов API. Смотрите: http://developer.github.com/v3/
GitHub API также устанавливает Cache-Control: private, max-age=60
Таким образом, у вас есть 60 секунд свежести - это означает, что запросы на один и тот же ресурс, выполненные с интервалом менее 60 секунд, даже не будут отправляться на сервер.
Ваши рассуждения об использовании одного условного запроса GET к ресурсу, который, несомненно, изменяется, если что-либо в репо изменилось (например, ресурс, показывающий значение шага HEAD), звучат разумно - поскольку если этот ресурс не изменился, то вы не Не нужно проверять отдельные файлы, поскольку они точно не изменились.