Github API指定可在条件请求Last-Modified
和ETag
中使用的两个标头。查询API时哪个更可靠?
对于上下文:当在大型仓库的每个子目录上使用api端点GET /repos/:owner/:repo/git/trees/:sha
时,每个响应都包含相同的last-modified
值(即使github上的repo显示不同的创作日期),而{ {1}}每个值都不同。我想知道etag
是否是回购内容状态更改的更精细表示(用于缓存目的)。
答案 0 :(得分:2)
阅读“ETags: a pretty sweet feature of HTTP 1.1”,它说:
“ETags allow dynamic content to be cached using an app-specific "opaque token"”
ETag或实体标记是一个不透明的标记,用于标识特定URL所服务的组件的版本。令牌可以是用引号括起来的任何东西;通常它是内容的md5哈希,或内容的VCS版本号。
如果答案的内容相同,那么每次ETag应该是相同的。
我刚刚用https://api.github.com/repos/VonC/gopanic/git/trees/master对其进行了测试,即使重复调用,它的ETag确实仍为W/"34a03ea1d4dc0b5d533ecf8d36492879"
。
但是,如果我为每个子文件夹获取树,那么ETag会有所不同,因为它代表了不同响应内容的签名。
ETag的优势在于它不依赖于日期(其时钟可能因各种原因而变化),但在答案的内容上:如果不变,则表示发送的内容仍然与发送的内容相同之前寄过。
答案 1 :(得分:1)
不幸的是,至少在2019年8月1日,GitHub API的状态以及/releases/latest
端点的ETag
都没有给出一致的值。
大多数,它会为您提供一致的不变的ETag
值,但是随机地(有时是经常)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
保持原样,因此与GET
相比,仅使用该标头进行条件ETag
会导致API的可缓存性更高。