缓存Github API调用

缓存Github API调用,api,caching,github,github-api,Api,Caching,Github,Github Api,我有一个与缓存API调用相关的一般性问题,在本例中是对Github API的调用 假设我的应用程序中有一个页面,显示回购协议的文件名和自述文件的内容。这意味着我必须进行一些API调用才能检索到它 现在,假设我想在两者之间添加一些类似memcached的东西,所以如果不需要的话,我不会一遍又一遍地进行这些调用 你通常会怎么做?如果我没有在Github上启用webhook,我就无法知道缓存是否应该过期。我总是可以打一个电话来获取头部的当前sha,如果它没有改变,就用缓存代替。但这是在回购层面上,而不

我有一个与缓存API调用相关的一般性问题,在本例中是对Github API的调用

假设我的应用程序中有一个页面,显示回购协议的文件名和自述文件的内容。这意味着我必须进行一些API调用才能检索到它

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

你通常会怎么做?如果我没有在Github上启用webhook,我就无法知道缓存是否应该过期。我总是可以打一个电话来获取头部的当前sha,如果它没有改变,就用缓存代替。但这是在回购层面上,而不是在文件层面上

我可以想象我可以用对象sha做类似的事情,但是如果我需要调用API来获取这些,它就无法实现缓存的目的

你会怎么做?我知道像pross.io这样的服务现在没有缓存,但是如果应该的话,该怎么做呢


谢谢

仅使用HTTP缓存就足以满足您的用例吗?HTTP缓存的目的不仅仅是提供一种在已有新响应时不发出请求的方法,它还使您能够快速验证缓存中已有的响应是否有效(如果响应是新的,服务器不会再次发送完整的响应)

查看GitHub API响应,我可以看到GitHub正确设置了相关的HTTP头(ETag、上次修改、缓存控制)

因此,您只需执行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
因此,GithubAPI正确地进行HTTP缓存,您应该使用它。当然,您还必须使用支持HTTP缓存的HTTP客户端。最好的情况是,如果您得到一个304 Not modified响应,GitHub不会减少您剩余的API调用配额。见:

GitHub API还设置了
Cache-Control:private,max-age=60
头,因此您有60秒的刷新时间——这意味着对相同资源的请求间隔不到60秒,甚至不会发送到服务器


如果repo中的任何内容发生了变化(例如,一个显示头部sha的资源),那么您使用单个条件GET请求来请求一个肯定会发生变化的资源的理由听起来是合理的——因为如果该资源没有发生变化,那么您就不必检查单个文件,因为它们肯定没有发生变化。

谢谢Ivan。这太棒了。使用HTTP缓存还意味着我不需要自己的中间层API路由来缓存memcached中的内容。通过这种方式,我可以直接从客户端通过CORS(如果需要,可以使用本地存储)。是否可能不是github中的所有端点都返回上次修改的
header?例如,对里程碑端点的调用不会返回任何上次修改的
头:curl-i,但会返回
ETag
,因此缓存此类资源的唯一方法是使用组合标记ETag,对吗?@p1nox是的,这是可能的。如果你读了这篇文章,你会注意到这一部分:“大多数回复返回一个ETag标题。许多回复也返回一个最后修改的标题。”注意它说的是“大多数”和“很多”,而不是“全部”。是的,我看到了,但有点模棱两可,我希望我在阅读后的假设不是真的:P.谢谢@IvanZuzak。