缓存Github API调用

时间:2013-02-15 00:42:43

标签: api caching github github-api

我有一个与缓存API调用有关的一般性问题,在这个实例中调用了Github API。

假设我的应用中有一个页面,其中显示了repo的文件名和README的内容。这意味着我将不得不进行一些API调用以便检索它。

现在,假设我想在两者之间添加类似memcached的内容,所以如果我不需要,我不会一遍又一遍地进行这些调用。

你通常会怎么做?如果我没有在Github上启用webhook,我无法知道缓存是否会过期。我总是可以进行一次调用来获取HEAD的当前sha,如果没有更改,请使用cache。但这是在回购级别,而不是在文件级别。

我可以想象我可以使用object-sha来做类似的事情,但是如果我需要调用API来获取它们,它就会失去缓存的目的。

你会怎么做?我知道像prose.io这样的服务现在没有缓存,但如果它应该,那么这种方法会是什么?

由于

1 个答案:

答案 0 :(得分:16)

使用HTTP缓存是否足以满足您的使用需求? HTTP缓存的目的不仅仅是提供一种不提出请求的方法(如果您已经有了新的响应),而且还可以让您快速验证缓存中已有的响应是否有效(没有服务器发送完整的响应)如果它是新鲜的再次响应)。

查看GitHub API响应,我可以看到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未修改的响应,您的HTTP客户端将从其缓存中提取响应:

304 Not Modified

因此,GitHub API正确进行HTTP缓存,您应该使用它。当然,您还必须使用支持HTTP缓存的HTTP客户端。最好的是,如果你得到一个304 Not modified响应--GitHub不会减少剩余的API调用配额。请参阅:http://developer.github.com/v3/#conditional-requests

GitHub API还设置了Cache-Control: private, max-age=60标头,因此您有60秒的新鲜度 - 这意味着相隔不到60秒的相同资源的请求甚至不会对服务器进行。

关于对资源使用单个条件GET请求的理由,如果repo中的任何内容发生了变化(例如,显示HEAD sha的资源)肯定会发生变化,这听起来很合理 - 因为如果该资源没有改变,那么您不必检查单个文件,因为它们确实没有更改。