最佳做法

授权

向 Google Photos API 发出的所有请求都必须由已通过身份验证的用户授权。

根据您所编写应用的类型,OAuth 2.0 的具体授权流程可能会略有不同。下面是适用于所有应用类型的大致流程:

  1. 按照以下操作准备授权流程:
    • 使用 Google API 控制台
    • 启用 Google 相册 API 并获取 OAuth 详细信息(例如客户端 ID 和客户端密钥)。如需了解详情,请参阅使用入门
  2. 为了访问用户数据,该应用会向 Google 请求获取 特定访问范围内
  3. Google 会向用户显示同意屏幕,请求他们授权 来请求获取某些数据
  4. 待该用户同意后,Google 会为应用提供一个时效很短的访问令牌。
  5. 应用会请求获取用户数据,并在请求中附加访问令牌。
  6. 如果 Google 确定请求和令牌有效,就会返回 请求的数据

要确定适合您应用的作用域,请参阅授权 范围

对于某些应用类型,此流程还包含其他步骤,例如使用 刷新令牌以获取新的访问令牌。如需详细了解适用于各类应用的不同流程,请参阅使用 OAuth 2.0 访问 Google API

缓存

保持数据最新。

如果您需要暂时存储媒体内容(例如缩略图、照片或视频) 出于性能方面的原因,每次使用时缓存时间不要超过 60 分钟 指南。

此外,您不应存储 baseUrls,该内容大约会在 60 分钟后过期。

媒体内容 ID 和影集 ID,用于对用户媒体库中的内容进行唯一标识 不受缓存限制您可以无限期存储这些 ID(受限于应用的隐私权政策)。使用媒体内容 ID 和影集 ID 重新使用适当的端点检索可访问的网址和数据。对于 请参阅获取媒体内容 项商品详情 影集

如果您要刷新许多媒体项,可能更高效的做法是存储 返回媒体内容的搜索参数,并重新提交查询以重新加载 数据。

SSL 访问

使用 以下网址:

https://photoslibrary.googleapis.com/v1/service/output?parameters

通过 HTTP 发出的请求将被拒绝。

错误处理

如需了解如何处理 API 返回的错误,请参阅 Cloud API 的处理错误部分。

重试失败的请求

客户端应在出现 5xx 错误时使用指数退避算法重试,如 指数退避算法。最短延迟时间应为 1 s (除非另有说明)。

对于 429 错误,客户端在重试时的最小延迟可能为 30s。对于所有其他错误,重试请求可能并不适用。请确保您的请求具有幂等性,同时您可通过查看错误消息获取指导。

指数退避算法

在极少数情况下,您的请求可能会在传送时出错。您可能会收到 4XX5XX HTTP 响应代码,或者 TCP 连接可能会在客户端与 Google 服务器之间的某处出现错误。通常情况下,重试请求值得一试。首次请求失败后,后续请求可能会成功。但是,切勿进行循环操作,即反复向 Google 服务器发出请求。这种循环行为可能会使客户端与 Google 之间的网络过载,给多方造成问题。

更好的方法是不断增加两次重试之间的延迟。通常 每次尝试都会使延迟时间增加一个乘法因子, 这称为指数函数 退避时间

您还应该注意,应用中没有更高层级的重试代码 调用链来快速连续地重复发出请求。

合理使用 Google API

设计拙劣的 API 客户端可能会给网络和 Google 服务器增加额外负载。此部分包含适用于 API 客户端的一些最佳实践。遵循这些最佳实践有助于您的应用避免因无意中滥用 API 而遭到屏蔽。

同步请求

向 Google API 发起大量同步请求在行为上类似于对 Google 基础设施的分布式拒绝服务 (DDoS) 攻击,我们也将据此采取相应处理措施。为避免这种情况,您应确保 API 请求 无法在客户端之间同步。

例如,假设某个应用显示当前时间 可用区。此应用可能会在客户端操作系统中设置警报,并在分钟开始时唤醒该操作系统,以便更新显示时间。在处理与该警报相关的事务时,此应用不能调用任何 API。

但通过 API 调用来响应固定警报的做法并不妥当,因为这会导致 API 调用与分钟开始时间同步(即使在不同设备之间亦是如此),而非在一段时间内均匀分布。若应用未经合理设计,则此操作会导致在每分钟开始时产生正常水平 60 倍的流量。

相较之下,我们可以采用一种较好的设计,即将第二个警报设为随机选择的时间。当第二个闹铃触发时,应用会调用任意 以及存储结果所需的 API。要在 分钟,应用会使用之前存储的结果,而不是调用 API。使用此方法,API 调用会随时间均匀分布。此外,在更新显示画面时,API 调用也不会使显示延迟。

除了分钟开始时间,您还应注意不要设置其他常见同步时间,如小时开始时间和每天开始时间(午夜)。