哪个对Github API条件请求,ETag或Last-Modified更可靠?

时间:2015-01-21 05:18:04

标签: github-api etag last-modified

Github API指定可在条件请求Last-ModifiedETag中使用的两个标头。查询API时哪个更可靠?

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

2 个答案:

答案 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的可缓存性更高。