gpt4 book ai didi

api - 缓存 Github API 调用

转载 作者:行者123 更新时间:2023-12-04 01:54:39 26 4
gpt4 key购买 nike

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

假设我的应用程序中有一个页面,其中显示了存储库的文件名和自述文件的内容。这意味着我将不得不调用一些 API 来检索它。

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

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

我可以想象我可以用 object-sha 做类似的事情,但是如果我无论如何都需要调用 API 来获取这些,它就违背了缓存的目的。

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

谢谢

最佳答案

仅使用 HTTP 缓存是否足以满足您的用例? HTTP 缓存的目的不仅仅是提供一种在您已有新响应的情况下不发出请求的方法,而是 - 它还使您能够快速验证缓存中已有的响应是否有效(无需服务器发送完整的响应)如果它是新鲜的再次响应)。
查看 GitHub API 响应,我可以看到 GitHub 正确设置了相关的 HTTP header (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 缓存 header ,以便它实际上是一个条件 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
因此,GitHub API 正确执行 HTTP 缓存,您应该使用它。当然,您还必须使用支持 HTTP 缓存的 HTTP 客户端。最好的事情是,如果您收到 304 Not modified 响应 - GitHub 不会减少您剩余的 API 调用配额。见: https://docs.github.com/en/rest/overview/resources-in-the-rest-api#conditional-requests
GitHub API 还设置了 Cache-Control: private, max-age=60 header ,所以你有 60 秒的新鲜度——这意味着对相同资源的请求间隔小于 60 秒甚至不会发送到服务器。
您关于对资源使用单个条件 GET 请求的推理,如果 repo 中的任何内容发生更改(例如,显示 HEAD 的 sha 的资源)肯定会更改的资源,这听起来很合理——因为如果该资源没有更改,那么您就不会不必检查单个文件,因为它们肯定没有改变。

关于api - 缓存 Github API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14886664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com