跳至主要内容

使用 REST API 的最佳实践

使用 GitHub API 时,请遵循以下最佳实践。

避免轮询

您应该订阅 Webhook 事件,而不是轮询 API 以获取数据。这将有助于您的集成保持在 API 速率限制内。有关更多信息,请参阅“Webhook 文档”。

进行身份验证请求

身份验证请求的初始速率限制高于未经身份验证的请求。为了避免超过速率限制,您应该进行身份验证请求。有关更多信息,请参阅“REST API 的速率限制”。

避免并发请求

为了避免超过次要速率限制,您应该按顺序而不是并发地进行请求。为了实现这一点,您可以为请求实现一个队列系统。

在可变请求之间暂停

如果您正在进行大量的 POSTPATCHPUTDELETE 请求,请在每次请求之间至少等待一秒钟。这将有助于您避免次要速率限制。

适当地处理速率限制错误

如果您收到速率限制错误,您应该根据以下指南暂时停止进行请求

  • 如果 retry-after 响应头存在,您应该在经过那么多秒后才能重试您的请求。
  • 如果 x-ratelimit-remaining 头为 0,您应该在 x-ratelimit-reset 头指定的时间之后才能进行另一个请求。x-ratelimit-reset 头以 UTC 纪元秒为单位。
  • 否则,请等待至少一分钟后再重试。如果您的请求由于次要速率限制而继续失败,请在重试之间等待指数增加的时间,并在特定次数的重试后抛出错误。

如果您在被限速的情况下继续发出请求,可能会导致您的集成被封禁。

遵循重定向

GitHub REST API 在适当的情况下使用 HTTP 重定向。您应该假设任何请求都可能导致重定向。收到 HTTP 重定向不是错误,您应该遵循重定向。

301 状态码表示永久重定向。您应该将您的请求重复到 location 标头指定的 URL。此外,您应该更新您的代码以在将来的请求中使用此 URL。

302307 状态码表示临时重定向。您应该将您的请求重复到 location 标头指定的 URL。但是,您不应该更新您的代码以在将来的请求中使用此 URL。

其他重定向状态码可能会根据 HTTP 规范使用。

不要手动解析 URL

许多 API 端点在响应主体中的字段中返回 URL 值。您不应该尝试解析这些 URL 或预测未来 URL 的结构。如果 GitHub 在将来更改 URL 的结构,这会导致您的集成中断。相反,您应该查找包含您需要的信息的字段。例如,创建问题的端点返回一个 html_url 字段,其值为 https://github.com/octocat/Hello-World/issues/1347,以及一个 number 字段,其值为 1347。如果您需要知道问题的编号,请使用 number 字段,而不是解析 html_url 字段。

同样,您不应该尝试手动构建分页查询。相反,您应该使用链接标头来确定您可以请求哪些结果页。有关更多信息,请参阅“在 REST API 中使用分页”。

在适当的情况下使用条件请求

大多数端点返回 etag 标头,许多端点返回 last-modified 标头。您可以使用这些标头的值来发出条件请求。如果响应没有改变,您将收到 304 Not Modified 响应。如果返回 304 响应,则发出条件请求不会计入您的主要速率限制。

例如,如果之前的请求返回了 etag 头部值为 644b5b0155e6404a9cc4bd9d8b1ae730,您可以在将来的请求中使用 if-none-match 头部。

curl https://api.github.com/meta --include --header 'if-none-match: "644b5b0155e6404a9cc4bd9d8b1ae730"'

例如,如果之前的请求返回了 last-modified 头部值为 Wed, 25 Oct 2023 19:17:59 GMT,您可以在将来的请求中使用 if-modified-since 头部。

curl https://api.github.com/repos/github/docs --include --header 'if-modified-since: Wed, 25 Oct 2023 19:17:59 GMT'

不要忽略错误

您不应该忽略重复的 4xx5xx 错误代码。相反,您应该确保正确地与 API 交互。例如,如果端点请求字符串而您传递的是数值,您将收到验证错误。类似地,尝试访问未授权或不存在的端点将导致 4xx 错误。

故意忽略重复的验证错误可能会导致您的应用程序因滥用而被暂停。

进一步阅读