Кэширование вызовов 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), звучат разумно - поскольку если этот ресурс не изменился, то вы не Не нужно проверять отдельные файлы, поскольку они точно не изменились.

Другие вопросы по тегам