跳至主要内容

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 方法是 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 建议使用您的 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 命令(如 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 选项传递数字、布尔值或空值参数。使用 -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"

使用查询参数的示例请求

"列出公共事件" 端点 默认返回三十个问题。以下示例使用 per_page 查询参数返回两个问题而不是 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"

使用查询参数的示例请求

"列出公共事件" 端点 默认返回三十个问题。以下示例使用 per_page 查询参数返回两个问题而不是 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/plain 值的 content-type 头部和一个带有 2022-11-28 值的 X-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 参考文档