Github API Conditional Requests,ETag 和 Last-Modified 哪个更靠谱?

Which is more reliable for Github API Conditional Requests, ETag or Last-Modified?

Github API 指定两个 headers 可用于条件请求,Last-ModifiedETag。查询API?

哪个更靠谱

对于上下文:在大型存储库的每个子目录上使用 api 端点 GET /repos/:owner/:repo/git/trees/:sha 时,每个响应都包含相同的 last-modified 值(即使 [=27 上的存储库=] 显示不同的创作日期),而每个的 etag 值不同。我想知道 ETag 是否是回购内容状态更改(用于缓存目的)的更精细表示。

阅读“ETags: a pretty sweet feature of HTTP 1.1”,它说:

"ETags allow dynamic content to be cached using an app-specific "opaque token""

An ETag, or entity tag, is an opaque token that identifies a version of the component served by a particular URL. The token can be anything enclosed in quotes; often it's an md5 hash of the content, or the content's VCS version number.

如果答案的内容相同,则每次的ETag都应该相同。

我刚刚用 https://api.github.com/repos/VonC/gopanic/git/trees/master 测试了它,实际上它的 ETag 仍然是 W/"34a03ea1d4dc0b5d533ecf8d36492879" 即使重复调用。

但是我应该为每个子文件夹获取树,然后 ETag 会有所不同,因为它代表不同响应内容的签名。

ETag的优点是它不依赖于日期(时钟可能因各种原因而有所不同),而是依赖于答案的内容:如果不变,则表示发送的内容与之前相同之前发的那个

不幸的是,至少在 2019 年 8 月 1 日的状态下,GitHub API 和 /releases/latest 端点 ETag 没有给出一致的值。

大多数 时间它会给你一致的 non-changing ETag 值,但是 运行domly(有时经常) ETag 会有所不同。看我的例子,我 运行 一个 API 调用了几次:

curl -IsL -H "Accept-Encoding: gzip" https://api.github.com/repos/mautic/mautic/releases/latest | grep -P '^(HTTP/|ETag:|X-RateLimit-Remaining|Last-Mod)'

第一个结果:

HTTP/1.1 200 OK
X-RateLimit-Remaining: 56
ETag: W/"b86f015c353e7c1d773f1f781d4cf822"
Last-Modified: Mon, 25 Mar 2019 23:14:15 GMT

一段时间后:

HTTP/1.1 200 OK
X-RateLimit-Remaining: 59
ETag: W/"9f670edf97e04c5c23cce74457be61a3"
Last-Modified: Mon, 25 Mar 2019 23:14:15 GMT

请注意 Last-Modified 如何保持完整,因此与 ETag 相比,仅使用 header 进行条件 GET 将导致更好的 API 可缓​​存性。