跳至主要内容

REST API 入门

了解如何使用 GitHub REST API。

简介

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

关于 REST API 请求

本节介绍构成 API 请求的元素

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

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

HTTP 方法

端点的 HTTP 方法定义了它对给定资源执行的操作类型。一些常见的 HTTP 方法包括 `GET`、`POST`、`DELETE` 和 `PATCH`。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 端点指定您应该传递一个 `Accept` 标头,其值为 `application/vnd.github+json`。`Accept` 标头的值是媒体类型。有关媒体类型的更多信息,请参见 "媒体类型"。

X-GitHub-Api-Version

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

User-Agent

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

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

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

如果您使用 Octokit.js SDK,SDK 将为您发送有效的 User-Agent 标头。但是,GitHub 建议使用您的 GitHub 用户名或应用程序名称作为 User-Agent 标头值。这使 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 进行身份验证。

    Shell
    gh auth login
    

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

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

    当您选择 HTTPS 作为 Git 操作的首选协议并回答“是”以确认您是否要使用您的 GitHub 凭据对 Git 进行身份验证时,GitHub CLI 会自动为您存储您的 Git 凭据。这很有用,因为它允许您使用 git pushgit pull 等 Git 命令,而无需设置单独的凭据管理器或使用 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 选项传递数字、布尔值或空值参数。使用 -f 选项传递字符串参数。

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

    如果您不需要在请求中指定任何正文参数或查询参数,请省略此选项。有关更多信息,请参阅“正文参数”和“查询参数”。有关示例,请参阅“使用正文参数的示例请求”和“使用查询参数的示例请求”。

示例请求

以下示例请求使用 "获取 Octocat" 端点 返回 Octocat 的 ASCII 艺术。

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

使用查询参数的示例请求

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

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

使用正文参数的示例请求

以下示例使用 "创建问题" 端点 在 octocat/Spoon-Knife 仓库中创建新问题。在响应中,找到您的问题的 html_url,并在浏览器中导航到您的问题。

Shell
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 后跟完整路径作为值。完整路径是包含 GitHub REST API 的基本 URL(https://api.github.com)和端点路径的 URL,例如: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" 端点 返回 Octocat 的 ASCII 艺术。

Shell
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 查询参数返回 2 个问题而不是 30 个,并使用 page 查询参数仅获取第一页结果。

Shell
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 替换为您拥有的或您所属组织拥有的存储库。您的令牌必须具有访问该存储库的权限,并对存储库问题具有读写权限。有关更多信息,请参阅“管理您的个人访问令牌”。

Shell
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 属性的值是一个对象,其中标头名称作为键,标头值作为值。

    例如,以下代码将发送一个值为 text/plaincontent-type 标头和一个值为 2022-11-28X-GitHub-Api-Version 标头。

    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 替换为存储库的名称。

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

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

Shell
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 替换为存储库的名称。

Shell
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

Shell
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 参考文档