Ron*_*nze 11 api caching github github-api
我有一个与缓存API调用有关的一般问题,在这个实例中调用Github API.
假设我的应用程序中有一个页面,其中显示了repo的文件名和README的内容.这意味着我必须执行一些API调用才能检索它.
现在,假设我想在两者之间添加类似memcached的内容,所以如果我不需要,我不会一遍又一遍地进行这些调用.
你通常会怎么做?如果我没有在Github上启用webhook,我无法知道缓存是否会过期.我总是可以进行一次调用来获取HEAD的当前sha,如果没有更改,请使用cache.但这是在回购级别,而不是在文件级别.
我可以想象我可以使用object-sha进行类似的操作,但是如果我需要调用API来获取它们,它就会失去缓存的目的.
你会怎么做?我知道像prose.io这样的服务现在没有缓存,但如果它应该,那么这种方法会是什么?
谢谢
Iva*_*zak 16
只是使用HTTP缓存对你的用例来说足够好吗?HTTP缓存的目的不仅仅是提供一种不提出请求的方法(如果您已经有了新的响应),而且还可以让您快速验证缓存中已有的响应是否有效(没有服务器发送完整的响应)如果它是新鲜的再次响应).
查看GitHub API响应,我可以看到GitHub正确设置了相关的HTTP头(ETag,Last-modified,Cache-control).
所以,你只需要做一个GET,例如:
GET https://api.github.com/users/izuzak/repos
Run Code Online (Sandbox Code Playgroud)
这会返回:
200 OK
...
ETag:"df739f00c5053d12ef3c625ad6b0fd08"
Last-Modified:Thu, 14 Feb 2013 22:31:14 GMT
...
Run Code Online (Sandbox Code Playgroud)
下次 - 您为同一资源执行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"
...
Run Code Online (Sandbox Code Playgroud)
并且看到 - 服务器返回304 Not modified响应,您的HTTP客户端将从其缓存中提取响应:
304 Not Modified
Run Code Online (Sandbox Code Playgroud)
因此,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的资源)肯定会发生变化,这听起来是合理的 - 因为如果该资源没有改变,那么你就不要因为它们没有确定地改变,所以必须检查各个文件.
归档时间: |
|
查看次数: |
1744 次 |
最近记录: |