跳至主要内容

REST API 入门

了解如何使用 GitHub REST API。

简介

本文介绍如何使用 GitHub CLI、curl 或 JavaScript 使用 GitHub REST API。有关快速入门指南,请参阅“GitHub REST API 快速入门”。

关于 REST API 请求

本部分介绍构成 API 请求的元素

对 REST API 的每个请求都包括一个 HTTP 方法和一个路径。根据 REST API 端点,您可能还需要指定请求标头、身份验证信息、查询参数或正文参数。

REST API 参考文档介绍了每个端点的 HTTP 方法、路径和参数。它还显示每个端点的示例请求和响应。有关更多信息,请参阅REST 参考文档

HTTP 方法

端点的 HTTP 方法定义了它对给定资源执行的操作类型。一些常见的 HTTP 方法是 GETPOSTDELETEPATCH。REST API 参考文档提供了每个端点的 HTTP 方法。

例如,“列出存储库问题”端点的 HTTP 方法是 GET

在可能的情况下,GitHub REST API 努力为每个操作使用适当的 HTTP 方法。

  • GET:用于检索资源。
  • POST:用于创建资源。
  • PATCH:用于更新资源的属性。
  • PUT:用于替换资源或资源集合。
  • DELETE:用于删除资源。

路径

每个端点都有一个路径。REST API 参考文档提供了每个端点的路径。例如,“列出存储库问题”端点的路径为 /repos/{owner}/{repo}/issues

路径中的花括号 {} 表示您需要指定路径参数。路径参数修改端点路径,并且在您的请求中是必需的。例如,“列出存储库问题”端点的路径参数为 {owner}{repo}。要在 API 请求中使用此路径,请将 {repo} 替换为您希望请求问题列表的存储库名称,并将 {owner} 替换为拥有该存储库的帐户名称。

标头

标头提供有关请求和所需响应的额外信息。以下是一些可以在请求中用于 GitHub REST API 的标头示例。有关使用标头的请求示例,请参阅“提出请求”。

Accept

大多数 GitHub REST API 端点指定您应传递值为 application/vnd.github+jsonAccept 标头。Accept 标头的值是一种媒体类型。有关媒体类型的更多信息,请参阅“媒体类型”。

X-GitHub-Api-Version

您应使用此标头指定要在请求中使用的 REST API 版本。有关更多信息,请参阅“API 版本”。

User-Agent

所有 API 请求都必须包含一个有效的 User-Agent 标头。User-Agent 标头标识提出请求的用户或应用程序。

默认情况下,GitHub CLI 会发送一个有效的 User-Agent 标头。但是,GitHub 建议对 User-Agent 标头值使用您的 GitHub 用户名或应用程序名称。这允许 GitHub 在出现问题时与您联系。

默认情况下,curl 会发送一个有效的 User-Agent 标头。但是,GitHub 建议对 User-Agent 标头值使用您的 GitHub 用户名或应用程序名称。这允许 GitHub 在出现问题时与您联系。

如果您使用 Octokit.js SDK,SDK 将为您发送一个有效的 User-Agent 标头。但是,GitHub 建议对 User-Agent 标头值使用您的 GitHub 用户名或应用程序名称。这允许 GitHub 在出现问题时与您联系。

以下是一个名为 Awesome-Octocat-App 的应用程序的 User-Agent 示例

User-Agent: Awesome-Octocat-App

不带User-Agent标头的请求将被拒绝。如果你提供了无效的User-Agent标头,你将收到403 Forbidden响应。

媒体类型

你可以通过将媒体类型添加到请求的Accept标头来指定一个或多个媒体类型。有关Accept标头的更多信息,请参阅“Accept”。

媒体类型指定你希望从 API 中获取的数据的格式。媒体类型特定于资源,允许它们独立更改并支持其他资源不支持的格式。每个 GitHub REST API 端点的文档将描述它支持的媒体类型。有关更多信息,请参阅“GitHub REST API 文档”。

GitHub REST API 支持的最常见的媒体类型是application/vnd.github+jsonapplication/json

有一些自定义媒体类型可以与某些端点一起使用。例如,用于管理提交拉取请求的 REST API 支持媒体类型diffpatchsha。媒体类型fullrawtexthtml由其他一些端点使用。

GitHub 的所有自定义媒体类型都如下所示:application/vnd.github.PARAM+json,其中PARAM是媒体类型的名称。例如,要指定raw媒体类型,可以使用application/vnd.github.raw+json

有关使用媒体类型的请求示例,请参阅“发出请求”。

身份验证

许多端点需要身份验证或在你经过身份验证后返回附加信息。此外,当你经过身份验证时,你可以每小时发出更多请求。

要对请求进行身份验证,你需要提供具有所需范围或权限的身份验证令牌。有几种不同的方法可以获取令牌:你可以创建个人访问令牌,使用 GitHub 应用生成令牌,或在 GitHub Actions 工作流中使用内置的GITHUB_TOKEN。有关更多信息,请参阅“对 REST API 进行身份验证”。

有关使用身份验证令牌的请求示例,请参阅“发出请求”。

注意:如果你不想创建令牌,可以使用 GitHub CLI。GitHub CLI 将为你处理身份验证,并帮助保护你的帐户安全。有关更多信息,请参阅此页面的GitHub CLI 版本

警告:将你的访问令牌视为密码或其他敏感凭证。有关更多信息,请参阅“保护你的 API 凭证安全”。

虽然某些 REST API 端点无需身份验证即可访问,但 GitHub CLI 要求你在使用 api 子命令进行 API 请求之前进行身份验证。使用 auth login 子命令向 GitHub 进行身份验证。有关更多信息,请参阅“进行请求”。

要对请求进行身份验证,你需要提供具有所需范围或权限的身份验证令牌。有几种不同的方法可以获取令牌:你可以创建个人访问令牌,使用 GitHub 应用生成令牌,或在 GitHub Actions 工作流中使用内置的GITHUB_TOKEN。有关更多信息,请参阅“对 REST API 进行身份验证”。

有关使用身份验证令牌的请求示例,请参阅“发出请求”。

警告:将你的访问令牌视为密码或其他敏感凭证。有关更多信息,请参阅“保护你的 API 凭证安全”。

参数

许多 API 方法要求或允许你在请求中通过参数发送附加信息。有几种不同类型的参数:路径参数、正文参数和查询参数。

路径参数

路径参数修改端点路径。这些参数在你的请求中是必需的。有关更多信息,请参阅“路径”。

正文参数

正文参数允许你向 API 传递附加数据。这些参数可以是可选的或必需的,具体取决于端点。例如,正文参数可能允许你在创建新问题时指定问题标题,或在启用或禁用功能时指定某些设置。每个 GitHub REST API 端点的文档将描述它支持的正文参数。有关更多信息,请参阅“GitHub REST API 文档”。

例如,“创建问题”端点要求你在请求中为新问题指定标题。它还允许你选择性地指定其他信息,例如要放入问题正文的文本、要分配给新问题的用户或要应用于新问题的标签。有关使用正文参数的请求示例,请参阅“进行请求”。

你必须对请求进行身份验证才能传递正文参数。有关更多信息,请参阅“身份验证”。

查询参数

查询参数允许你控制为请求返回哪些数据。这些参数通常是可选的。每个 GitHub REST API 端点的文档将描述它支持的任何查询参数。有关更多信息,请参阅“GitHub REST API 文档”。

例如,“列出公开事件”端点默认返回三十个问题。您可以使用 per_page 查询参数来返回两个问题,而不是 30 个。您可以使用 page 查询参数仅获取结果的第一页。有关使用查询参数的请求示例,请参阅“发出请求”。

发出请求

本部分演示如何使用 GitHub CLI 对 GitHub REST API 发出经过身份验证的请求。

1. 设置

在 macOS、Windows 或 Linux 上安装 GitHub CLI。有关更多信息,请参阅 GitHub CLI 存储库中的 安装

2. 身份验证

  1. 通过从您的终端运行此命令来使用 GitHub 进行身份验证。

    外壳
    gh auth login
    

    您可以使用 --scopes 选项来指定您想要的范围。如果您想使用您创建的令牌进行身份验证,则可以使用 --with-token 选项。有关更多信息,请参阅 GitHub CLI auth login 文档

  2. 按照屏幕上的提示操作。

    当您选择 HTTPS 作为 Git 操作的首选协议并回答询问您是否希望使用 GitHub 凭据对 Git 进行身份验证的提示时,“是”,GitHub CLI 会自动为您存储 Git 凭据。这很有用,因为它允许您使用 Git 命令(如 git pushgit pull),而无需设置单独的凭据管理器或使用 SSH。

3. 为您的请求选择一个端点

  1. 选择一个端点来发出请求。您可以浏览 GitHub 的 REST API 文档,以发现可用于与 GitHub 交互的端点。

  2. 识别端点的 HTTP 方法和路径。您将随请求一起发送这些信息。有关更多信息,请参阅“HTTP 方法”和“路径”。

    例如,“创建问题”端点使用 HTTP 方法 POST 和路径 /repos/{owner}/{repo}/issues

  3. 识别任何必需的路径参数。必需的路径参数显示在端点路径中的花括号 {} 中。用所需的值替换每个参数占位符。有关更多信息,请参阅“路径”。

    例如,“创建问题”端点使用路径 /repos/{owner}/{repo}/issues,路径参数为 {owner}{repo}。要在您的 API 请求中使用此路径,请用您希望创建新问题的存储库的名称替换 {repo},并用拥有该存储库的帐户的名称替换 {owner}

4. 使用 GitHub CLI 发起请求

使用 GitHub CLI api 子命令发起 API 请求。有关详细信息,请参阅 GitHub CLI api 文档

在请求中,指定以下选项和值

  • --method 后跟 HTTP 方法和端点的路径。有关详细信息,请参阅“HTTP 方法”和“路径”。

  • --header:

    • Accept:在 Accept 标头中传递媒体类型。要在 Accept 标头中传递多个媒体类型,请使用逗号分隔媒体类型:Accept: application/vnd.github+json,application/vnd.github.diff。有关详细信息,请参阅“Accept”和“媒体类型”。
    • X-GitHub-Api-Version:在 X-GitHub-Api-Version 标头中传递 API 版本。有关详细信息,请参阅“X-GitHub-Api-Version”。
  • -f-F 后跟 key=value 格式的任何主体参数或查询参数。使用 -F 选项传递数字、布尔值或 null 的参数。使用 -f 选项传递字符串参数。

    某些端点使用数组查询参数。要在查询字符串中发送数组,请对每个数组项使用一次查询参数,并在查询参数名称后附加 []。例如,要提供两个存储库 ID 的数组,请使用 -f repository_ids[]=REPOSITORY_A_ID -f repository_ids[]=REPOSITORY_B_ID

    如果你不需要在请求中指定任何主体参数或查询参数,请省略此选项。有关详细信息,请参阅“主体参数”和“查询参数”。有关示例,请参阅“使用主体参数的示例请求”和“使用查询参数的示例请求”。

示例请求

以下示例请求使用 “获取 Octocat”端点 以 ASCII 艺术形式返回 Octocat。

外壳
gh api --method GET /octocat \
--header 'Accept: application/vnd.github+json' \
--header "X-GitHub-Api-Version: 2022-11-28"

使用查询参数的示例请求

列出公共事件”端点默认返回 30 个问题。以下示例使用 per_page 查询参数返回两个问题,而不是 30 个,并使用 page 查询参数仅获取第一页结果。

外壳
gh api --method GET /events -F per_page=2 -F page=1
--header 'Accept: application/vnd.github+json' \

使用主体参数的示例请求

以下示例使用 “创建议题”端点 在 octocat/Spoon-Knife 存储库中创建新议题。在响应中,找到议题的 html_url,然后在浏览器中导航到议题。

外壳
gh api --method POST /repos/octocat/Spoon-Knife/issues \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28" \
-f title='Created with the REST API' \
-f body='This is a test issue created by the REST API' \

本部分演示如何使用 curl 对 GitHub REST API 发出经过身份验证的请求。

1. 设置

你的计算机上必须安装 curl。要检查是否已安装 curl,请在命令行上运行 curl --version

  • 如果输出提供了有关 curl 版本的信息,则表示已安装 curl
  • 如果你收到类似于 command not found: curl 的消息,则表示未安装 curl。下载并安装 curl。有关更多信息,请参阅 curl 下载页面

2. 为你的请求选择端点

  1. 选择一个端点来发出请求。您可以浏览 GitHub 的 REST API 文档,以发现可用于与 GitHub 交互的端点。

  2. 识别端点的 HTTP 方法和路径。您将随请求一起发送这些信息。有关更多信息,请参阅“HTTP 方法”和“路径”。

    例如,“创建问题”端点使用 HTTP 方法 POST 和路径 /repos/{owner}/{repo}/issues

  3. 识别任何必需的路径参数。必需的路径参数显示在端点路径中的花括号 {} 中。用所需的值替换每个参数占位符。有关更多信息,请参阅“路径”。

    例如,“创建问题”端点使用路径 /repos/{owner}/{repo}/issues,路径参数为 {owner}{repo}。要在您的 API 请求中使用此路径,请用您希望创建新问题的存储库的名称替换 {repo},并用拥有该存储库的帐户的名称替换 {owner}

3. 创建身份验证凭据

创建访问令牌以对请求进行身份验证。你可以保存令牌并将其用于多个请求。向令牌授予访问端点所需的任何范围或权限。你将在请求中使用 Authorization 标头发送此令牌。有关更多信息,请参阅“身份验证”。

4. 发出 curl 请求

使用 curl 命令发出请求。有关更多信息,请参阅 curl 文档

在请求中指定以下选项和值

  • --request-X 后跟 HTTP 方法作为值。有关更多信息,请参阅“HTTP 方法”。

  • --url 后跟完整路径作为值。完整路径是一个 URL,其中包括 GitHub REST API 的基本 URL (https://api.github.com) 和端点的路径,如下所示:https://api.github.com/PATH。用端点的路径替换 PATH。有关更多信息,请参阅“路径”。

    要使用查询参数,请在路径末尾添加 ?,然后以 parameter_name=value 的形式附加查询参数名称和值。使用 & 分隔多个查询参数。如果您需要在查询字符串中发送数组,请对每个数组项使用一次查询参数,并在查询参数名称后附加 []。例如,要提供两个存储库 ID 的数组,请使用 ?repository_ids[]=REPOSITORY_A_ID&repository_ids[]=REPOSITORY_B_ID。有关更多信息,请参阅“查询参数”。有关示例,请参阅“使用查询参数的示例请求”。

  • --header-H:

    • Accept:在 Accept 标头中传递媒体类型。要在 Accept 标头中传递多种媒体类型,请使用逗号分隔媒体类型,例如:Accept: application/vnd.github+json,application/vnd.github.diff。有关更多信息,请参阅“Accept”和“媒体类型”。
    • X-GitHub-Api-Version:在 X-GitHub-Api-Version 标头中传递 API 版本。有关详细信息,请参阅“X-GitHub-Api-Version”。
    • Authorization:在 Authorization 标头中传递您的身份验证令牌。请注意,在大多数情况下,您可以使用 Authorization: BearerAuthorization: token 来传递令牌。但是,如果您要传递 JSON Web 令牌 (JWT),则必须使用 Authorization: Bearer。有关更多信息,请参阅“身份验证”。有关使用 Authorization 标头的请求示例,请参阅“使用正文参数的示例请求”。
  • --data-d,后跟 JSON 对象中的任何正文参数。如果您不需要在请求中指定任何正文参数,请省略此选项。有关更多信息,请参阅“正文参数”。有关示例,请参阅“使用正文参数的示例请求”。

示例请求

以下示例请求使用 “获取 Octocat”端点 以 ASCII 艺术形式返回 Octocat。

外壳
curl --request GET \
--url "https://api.github.com/octocat" \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28"

使用查询参数的示例请求

列出公共事件”端点默认返回 30 个问题。以下示例使用 per_page 查询参数返回两个问题,而不是 30 个,并使用 page 查询参数仅获取第一页结果。

外壳
curl --request GET \
--url "https://api.github.com/events?per_page=2&page=1" \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/events

使用主体参数的示例请求

以下示例使用“创建问题”端点在 octocat/Spoon-Knife 存储库中创建一个新问题。将 YOUR-TOKEN 替换为您在之前的步骤中创建的身份验证令牌。

注意:如果您使用细粒度个人访问令牌,则必须将 octocat/Spoon-Knife 替换为您拥有或您所在的组织拥有的存储库。您的令牌必须有权访问该存储库,并具有存储库问题的读写权限。有关更多信息,请参阅“管理您的个人访问令牌”。

外壳
curl \
--request POST \
--url "https://api.github.com/repos/octocat/Spoon-Knife/issues" \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28" \
--header "Authorization: Bearer YOUR-TOKEN" \
--data '{
  "title": "Created with the REST API",
  "body": "This is a test issue created by the REST API"
}'

本部分演示如何使用 JavaScript 和 Octokit.js 向 GitHub REST API 发出请求。有关更详细的指南,请参阅“使用 REST API 和 JavaScript 编写脚本”。

1. 设置

您必须安装 octokit 才能使用以下示例中所示的 Octokit.js 库。

  • 安装 octokit。例如,npm install octokit。有关安装或加载 octokit 的其他方法,请参阅 Octokit.js 自述文件

2. 为你的请求选择端点

  1. 选择一个端点来发出请求。您可以浏览 GitHub 的 REST API 文档,以发现可用于与 GitHub 交互的端点。

  2. 识别端点的 HTTP 方法和路径。您将随请求一起发送这些信息。有关更多信息,请参阅“HTTP 方法”和“路径”。

    例如,“创建问题”端点使用 HTTP 方法 POST 和路径 /repos/{owner}/{repo}/issues

  3. 识别任何必需的路径参数。必需的路径参数显示在端点路径中的花括号 {} 中。用所需的值替换每个参数占位符。有关更多信息,请参阅“路径”。

    例如,“创建问题”端点使用路径 /repos/{owner}/{repo}/issues,路径参数为 {owner}{repo}。要在您的 API 请求中使用此路径,请用您希望创建新问题的存储库的名称替换 {repo},并用拥有该存储库的帐户的名称替换 {owner}

3. 创建访问令牌

创建访问令牌以对请求进行身份验证。你可以保存令牌并将其用于多个请求。向令牌授予访问端点所需的任何范围或权限。你将在请求中使用 Authorization 标头发送此令牌。有关更多信息,请参阅“身份验证”。

4. 使用 Octokit.js 发起请求

  1. 在脚本中导入 octokit。例如,import { Octokit } from "octokit";。有关导入 octokit 的其他方法,请参阅 Octokit.js 自述文件

  2. 使用令牌创建 Octokit 实例。将 YOUR-TOKEN 替换为你的令牌。

    JavaScript
    const octokit = new Octokit({ 
      auth: 'YOUR-TOKEN'
    });
    
  3. 使用 octokit.request 执行请求。

    • 将 HTTP 方法和路径作为第一个参数发送到 request 方法。有关更多信息,请参阅“HTTP 方法”和“路径”。
    • 在对象中指定所有路径、查询和正文参数,作为 request 方法的第二个参数。有关更多信息,请参阅“参数”。

    在以下示例请求中,HTTP 方法为 POST,路径为 /repos/{owner}/{repo}/issues,路径参数为 owner: "octocat"repo: "Spoon-Knife",正文参数为 title: "Created with the REST API"body: "This is a test issue created by the REST API"

    注意:如果您使用细粒度个人访问令牌,则必须将 octocat/Spoon-Knife 替换为您拥有或您所在的组织拥有的存储库。您的令牌必须有权访问该存储库,并具有存储库问题的读写权限。有关更多信息,请参阅“管理您的个人访问令牌”。

    JavaScript
    await octokit.request("POST /repos/{owner}/{repo}/issues", {
      owner: "octocat",
      repo: "Spoon-Knife",
      title: "Created with the REST API",
      body: "This is a test issue created by the REST API",
    });
    

    request 方法会自动传递 Accept: application/vnd.github+json 标头。要传递其他标头或不同的 Accept 标头,请将 headers 属性添加到作为第二个参数传递的对象中。headers 属性的值是一个对象,其中标头名称作为键,标头值作为值。

    例如,以下代码将发送一个 content-type 标头,其值为 text/plain,以及一个 X-GitHub-Api-Version 标头,其值为 2022-11-28

    JavaScript
    await octokit.request("GET /octocat", {
      headers: {
        "content-type": "text/plain",
        "X-GitHub-Api-Version": "2022-11-28",
      },
    });
    

使用响应

发出请求后,API 将返回响应状态代码、响应标头,以及可能是响应正文。

关于响应代码和标头

每个请求都将返回一个 HTTP 状态代码,表示响应的成功与否。有关响应代码的更多信息,请参阅 MDN HTTP 响应状态代码文档

此外,响应还将包含提供有关响应的更多详细信息的标头。以 X-x- 开头的标头是 GitHub 的自定义标头。例如,x-ratelimit-remainingx-ratelimit-reset 标头告诉你可以在一段时间内发出多少个请求。

要查看状态代码和标头,请在发送请求时使用 --include--i 选项。

例如,此请求获取 octocat/Spoon-Knife 存储库中的问题列表

gh api \
--header 'Accept: application/vnd.github+json' \
--method GET /repos/octocat/Spoon-Knife/issues \
-F per_page=2 --include

它返回的响应代码和标头类似于以下内容

HTTP/2.0 200 OK
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
Cache-Control: private, max-age=60, s-maxage=60
Content-Security-Policy: default-src 'none'
Content-Type: application/json; charset=utf-8
Date: Thu, 04 Aug 2022 19:56:41 GMT
Etag: W/"a63dfbcfdb73621e9d2e89551edcf9856731ced534bd7f1e114a5da1f5f73418"
Link: <https://api.github.com/repositories/1300192/issues?per_page=1&page=2>; rel="next", <https://api.github.com/repositories/1300192/issues?per_page=1&page=14817>; rel="last"
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
Server: GitHub.com
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
Vary: Accept, Authorization, Cookie, Accept-Encoding, Accept, X-Requested-With
X-Accepted-Oauth-Scopes: repo
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-Github-Api-Version-Selected: 2022-08-09
X-Github-Media-Type: github.v3; format=json
X-Github-Request-Id: 1C73:26D4:E2E500:1EF78F4:62EC2479
X-Oauth-Client-Id: 178c6fc778ccc68e1d6a
X-Oauth-Scopes: gist, read:org, repo, workflow
X-Ratelimit-Limit: 15000
X-Ratelimit-Remaining: 14996
X-Ratelimit-Reset: 1659645499
X-Ratelimit-Resource: core
X-Ratelimit-Used: 4
X-Xss-Protection: 0

在此示例中,响应代码为 200,表示请求成功。

使用 Octokit.js 发出请求时,request 方法会返回一个 Promise。如果请求成功,则 Promise 会解析为一个对象,其中包括响应的 HTTP 状态代码 (status) 和响应标头 (headers)。如果发生错误,则 Promise 会解析为一个对象,其中包括响应的 HTTP 状态代码 (status) 和响应标头 (response.headers)。

可以使用 try/catch 块来捕获发生的错误。例如,如果以下脚本中的请求成功,则脚本将记录状态代码和 x-ratelimit-remaining 标头的值。如果请求未成功,则脚本将记录状态代码、x-ratelimit-remaining 标头的值和错误消息。

在以下示例中,将 REPO-OWNER 替换为拥有该存储库的帐户的名称,将 REPO-NAME 替换为存储库的名称。

JavaScript
try {
  const result = await octokit.request("GET /repos/{owner}/{repo}/issues", {
    owner: "REPO-OWNER",
    repo: "REPO-NAME",
    per_page: 2,
  });

  console.log(`Success! Status: ${result.status}. Rate limit remaining: ${result.headers["x-ratelimit-remaining"]}`)

} catch (error) {
  console.log(`Error! Status: ${error.status}. Rate limit remaining: ${error.headers["x-ratelimit-remaining"]}. Message: ${error.response.data.message}`)
}

要查看状态代码和标头,请在发送请求时使用 --include--i 选项。

例如,此请求获取 octocat/Spoon-Knife 存储库中的问题列表

curl --request GET \
--url "https://api.github.com/repos/octocat/Spoon-Knife/issues?per_page=2" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer YOUR-TOKEN" \
--include

它返回的响应代码和标头类似于以下内容

HTTP/2 200
server: GitHub.com
date: Thu, 04 Aug 2022 20:07:51 GMT
content-type: application/json; charset=utf-8
cache-control: public, max-age=60, s-maxage=60
vary: Accept, Accept-Encoding, Accept, X-Requested-With
etag: W/"7fceb7e8c958d3ec4d02524b042578dcc7b282192e6c939070f4a70390962e18"
x-github-media-type: github.v3; format=json
link: <https://api.github.com/repositories/1300192/issues?per_page=2&sort=updated&direction=asc&page=2>; rel="next", <https://api.github.com/repositories/1300192/issues?per_page=2&sort=updated&direction=asc&page=7409>; rel="last"
access-control-expose-headers: ETag, Link, Location, Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
access-control-allow-origin: *
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: origin-when-cross-origin, strict-origin-when-cross-origin
content-security-policy: default-src 'none'
x-ratelimit-limit: 15000
x-ratelimit-remaining: 14996
x-ratelimit-reset: 1659645535
x-ratelimit-resource: core
x-ratelimit-used: 4
accept-ranges: bytes
content-length: 4936
x-github-request-id: 14E0:4BC6:F1B8BA:208E317:62EC2715

在此示例中,响应代码为 200,表示请求成功。

关于响应正文

许多端点将返回一个响应正文。除非另有说明,否则响应正文采用 JSON 格式。空白字段包含为 null,而不是省略。所有时间戳均以 UTC 时间、ISO 8601 格式返回:YYYY-MM-DDTHH:MM:SSZ

与 GraphQL API 中指定所需信息不同,REST API 通常会返回比所需信息更多的信息。如果需要,可以解析响应以提取特定信息。

例如,可以使用 > 将响应重定向到文件。在以下示例中,将 REPO-OWNER 替换为拥有该存储库的帐户的名称,将 REPO-NAME 替换为存储库的名称。

外壳
gh api \
--header 'Accept: application/vnd.github+json' \
--method GET /repos/REPO-OWNER/REPO-NAME/issues \
-F per_page=2 > data.json

然后,可以使用 jq 获取每个问题的标题和作者 ID

外壳
jq '.[] | {title: .title, authorID: .user.id}' data.json

前两个命令返回类似于以下内容

{
  "title": "Update index.html",
  "authorID": 10701255
}
{
  "title": "Edit index file",
  "authorID": 53709285
}

有关 jq 的更多信息,请参阅 jq 文档

例如,可以获取每个问题的标题和作者 ID。在以下示例中,将 REPO-OWNER 替换为拥有该存储库的帐户的名称,将 REPO-NAME 替换为存储库的名称。

JavaScript
try {
  const result = await octokit.request("GET /repos/{owner}/{repo}/issues", {
    owner: "REPO-OWNER",
    repo: "REPO-NAME",
    per_page: 2,
  });

  const titleAndAuthor = result.data.map(issue => {title: issue.title, authorID: issue.user.id})

  console.log(titleAndAuthor)

} catch (error) {
  console.log(`Error! Status: ${error.status}. Message: ${error.response.data.message}`)
}

例如,可以使用 > 将响应重定向到文件。在以下示例中,将 REPO-OWNER 替换为拥有该存储库的帐户的名称,将 REPO-NAME 替换为存储库的名称。

外壳
curl --request GET \
--url "https://api.github.com/repos/REPO-OWNER/REPO-NAME/issues?per_page=2" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer YOUR-TOKEN" > data.json

然后,可以使用 jq 获取每个问题的标题和作者 ID

外壳
jq '.[] | {title: .title, authorID: .user.id}' data.json

前两个命令返回类似于以下内容

{
  "title": "Update index.html",
  "authorID": 10701255
}
{
  "title": "Edit index file",
  "authorID": 53709285
}

有关 jq 的更多信息,请参阅 jq 文档

详细表示与摘要表示

响应可以包括资源的所有属性,也可以只包括一部分属性,具体取决于是获取单个资源还是资源列表。

  • 当您获取单个资源(例如特定存储库)时,响应通常会包含该资源的所有属性。这是资源的“详细”表示形式。
  • 当您获取资源列表(例如多个存储库的列表)时,响应将仅包含每个资源的部分属性。这是资源的“摘要”表示形式。

请注意,授权有时会影响表示形式中包含的详细信息量。

原因是某些属性对于 API 来说计算成本很高,因此 GitHub 从摘要表示形式中排除了这些属性。若要获取这些属性,您可以获取详细表示形式。

文档为每个 API 方法提供了一个示例响应。示例响应说明了该方法返回的所有属性。

超媒体

所有资源可能都有一个或多个链接到其他资源的 *_url 属性。这些属性旨在提供明确的 URL,以便适当的 API 客户端无需自行构建 URL。强烈建议 API 客户端使用这些属性。这样做将使开发人员更轻松地进行 API 的未来升级。所有 URL 预计都是适当的 RFC 6570 URI 模板。

然后,您可以使用类似于 uri_template gem 的内容扩展这些模板

>> tmpl = URITemplate.new('/notifications{?since,all,participating}')
>> tmpl.expand
=> "/notifications"

>> tmpl.expand all: 1
=> "/notifications?all=1"

>> tmpl.expand all: 1, participating: 1
=> "/notifications?all=1&participating=1"

后续步骤

本文演示了如何在存储库中列出和创建问题。为了获得更多练习,请尝试对问题发表评论、编辑问题的标题或关闭问题。有关更多信息,请参阅 "创建问题评论" 端点"更新问题" 端点

有关您可以使用的其他端点的更多信息,请参阅 REST 参考文档