我正在尝试使用etag来减少我的带宽和配额使用量,但是即使没有任何变化,/search也会返回一个新的etag。如果我在标头中指定以前的 etag,它仍然会发送内容。
该 api 调用是否支持它,或者我可能做错了什么?
YouTube支持Etags,但这取决于您询问的数据类型
ETag 是 HTTP 协议的标准部分,允许应用程序引用特定 API 资源的特定版本。资源可以是整个源,也可以是该源中的项。此功能支持以下用例:
缓存和条件检索 – 您的应用程序可以缓存 API 资源及其 ETag。然后,当您的应用程序请求 再次存储资源,它指定与之关联的 ETag 资源。如果资源已更改,API 将返回修改后的 资源以及与该版本的资源关联的 ETag。如果 资源未更改,API 返回 HTTP 304 响应 (未修改(,表示资源未更改。 您的应用程序可以通过提供服务来减少延迟和带宽使用 以这种方式缓存资源。
Google API 的客户端库在对 ETag 的支持方面有所不同。 例如,JavaScript 客户端库通过 允许的请求标头的白名单,其中包括 If-Match 和 如果不匹配。白名单允许正常的浏览器缓存发生,因此 如果资源的 ETag 未更改,则可以提供该资源 从浏览器缓存。另一方面,Obj-C 客户端不会 支持ETags。防止意外覆盖更改 – ETag 有助于确保多个 API 客户端不会无意中 覆盖彼此的更改。更新或删除资源时, 应用程序可以指定资源的 ETag。如果 ETag 没有 匹配该资源的最新版本,然后匹配 API 请求 失败。
在应用程序中使用 ETag 具有以下几个好处:
API 可以更快地响应缓存但未更改的请求 资源,从而降低延迟和带宽使用量。你 应用程序不会无意中覆盖对资源的更改 从另一个 API 客户端创建。
https://developers.google.com/youtube/v3/getting-started#etags
我通常会在Youtube上搜索视频,我只是存储它返回的Etag。要使用 etag,请创建一个标头请求,并将"If-None-Match"等于您的 etag 值。请注意,这应该是请求标头,而不是追加到终结点调用。您也可以使用"如果匹配"。
根据您使用的 API 类型,向请求标头插入新值的方式可能略有不同