Github API Conditional Requests,ETag 和 Last-Modified 哪个更靠谱?
Which is more reliable for Github API Conditional Requests, ETag or Last-Modified?
Github API 指定两个 headers 可用于条件请求,Last-Modified
和 ETag
。查询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 可缓存性。
Github API 指定两个 headers 可用于条件请求,Last-Modified
和 ETag
。查询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 可缓存性。