跳至主要内容

开始使用 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 端点要求您在 Accept 请求头中传递值 application/vnd.github+jsonAccept 请求头的值是一种媒体类型。有关媒体类型的更多信息,请参阅 媒体类型

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 端点无需身份验证即可访问,但使用 api 子命令发起 API 请求时,GitHub CLI 要求您先进行身份验证。使用 auth login 子命令登录 GitHub。更多信息,请参阅 发起请求

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

有关使用身份验证令牌的请求示例,请参阅 发起请求

警告

请像对待密码或其他敏感凭证一样对待您的访问令牌。更多信息,请参阅 确保 API 凭证安全

参数

许多 API 方法需要或允许您在请求中通过参数发送额外信息。参数类型包括:路径参数、请求体参数和查询参数。

路径参数

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

请求体参数

请求体参数允许您向 API 传递附加数据。这些参数可以是可选的,也可以是必需的,取决于端点。例如,创建新 issue 时的请求体参数可让您指定问题标题,或在启用/禁用功能时指定特定设置。每个 GitHub REST API 端点的文档会描述其支持的请求体参数。更多信息,请参阅 GitHub REST API 文档

例如,“创建 issue”端点要求您在请求中指定新 issue 的标题。它还允许您可选地指定其他信息,例如 issue 正文的文字、要指派的用户或要应用的标签。有关使用请求体参数的请求示例,请参阅 发起请求

您必须对请求进行身份验证才能使用请求体参数。更多信息,请参阅 身份验证

查询参数

查询参数允许您控制请求返回的数据。这些参数通常是可选的。每个 GitHub REST API 端点的文档会描述其支持的查询参数。更多信息,请参阅 GitHub REST API 文档

例如,“列出公共事件”端点默认返回三十个 issue。您可以使用 per_page 查询参数将返回数量改为两个,而使用 page 查询参数仅获取第一页的结果。有关使用查询参数的请求示例,请参阅 发起请求

发起请求

本节演示如何使用 GitHub CLI 对 GitHub REST API 发起已认证的请求。

1. 设置

在 macOS、Windows 或 Linux 上安装 GitHub CLI。更多信息,请参阅 GitHub CLI 仓库中的 Installation

2. 身份验证

  1. 要对 GitHub 进行身份验证,请在终端中运行以下命令。

    gh auth login
    

    您可以使用 --scopes 选项指定所需的作用域。如果想使用已创建的令牌进行身份验证,可使用 --with-token 选项。更多信息,请参阅 GitHub CLI auth login 文档

  2. 选择要进行身份验证的位置

    • 如果你在 GitHub.com 访问 GitHub,请选择 GitHub.com
    • 如果你在其他域名访问 GitHub,请选择 Other,然后输入你的主机名(例如:octocorp.ghe.com)。
  3. 按照屏幕上的其余提示操作。

    当你选择 HTTPS 作为 Git 操作的首选协议,并在提示是否使用 GitHub 凭据对 Git 进行身份验证时回答“是”,GitHub CLI 会自动为你存储 Git 凭据。这很有用,因为它允许你在无需单独的凭据管理器或使用 SSH 的情况下使用 git pushgit pull 等 Git 命令。

3. 为请求选择端点

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

  2. 确定该端点的 HTTP 方法和路径。您将在请求中发送这些信息。更多信息,请参阅 HTTP 方法路径

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

  3. 识别所有必需的路径参数。必需的路径参数在端点路径中以花括号 {} 显示。请将每个占位符替换为相应的值。更多信息,请参阅 路径

    例如,“创建 issue”端点的路径为 /repos/{owner}/{repo}/issues,路径参数为 {owner}{repo}。在 API 请求中使用此路径时,请将 {repo} 替换为您希望在其下创建新 issue 的仓库名称,将 {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”端点 返回 Octocat 的 ASCII 艺术图。

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

使用查询参数的示例请求

“列出公共事件”端点默认返回三十个 issue。以下示例使用 per_page 查询参数返回两个 issue,而使用 page 查询参数仅获取第一页的结果。

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

使用请求体参数的示例请求

以下示例使用 “创建 issue”端点 在 octocat/Spoon‑Knife 仓库中创建一个新 issue。在响应中,查找您 issue 的 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 方法路径

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

  3. 识别所有必需的路径参数。必需的路径参数在端点路径中以花括号 {} 显示。请将每个占位符替换为相应的值。更多信息,请参阅 路径

    例如,“创建 issue”端点的路径为 /repos/{owner}/{repo}/issues,路径参数为 {owner}{repo}。在 API 请求中使用此路径时,请将 {repo} 替换为您希望在其下创建新 issue 的仓库名称,将 {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 or -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 Token (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"

使用查询参数的示例请求

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

使用请求体参数的示例请求

以下示例使用 创建 issue 端点在 octocat/Spoon‑Knife 仓库中创建一个新 issue。请将 YOUR-TOKEN 替换为您在前一步创建的身份验证令牌。

注意

如果您使用细粒度个人访问令牌,必须将 octocat/Spoon‑Knife 替换为您拥有或所属组织成员的仓库。您的令牌必须对该仓库具备访问权限,并且对仓库 issue 拥有读写权限。更多信息,请参阅 管理个人访问令牌

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 README

2. 为请求选择端点

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

  2. 确定该端点的 HTTP 方法和路径。您将在请求中发送这些信息。更多信息,请参阅 HTTP 方法路径

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

  3. 识别所有必需的路径参数。必需的路径参数在端点路径中以花括号 {} 显示。请将每个占位符替换为相应的值。更多信息,请参阅 路径

    例如,“创建 issue”端点的路径为 /repos/{owner}/{repo}/issues,路径参数为 {owner}{repo}。在 API 请求中使用此路径时,请将 {repo} 替换为您希望在其下创建新 issue 的仓库名称,将 {owner} 替换为拥有该仓库的账户名称。

3. 创建访问令牌

创建访问令牌以对请求进行身份验证。您可以保存该令牌并在多个请求中使用。为令牌分配访问端点所需的任何作用域或权限。您将在请求的 Authorization 请求头中发送此令牌。更多信息,请参阅 身份验证

4. 使用 Octokit.js 发起请求

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

  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 替换为您拥有或所属组织成员的仓库。您的令牌必须对该仓库具备访问权限,并且对仓库 issue 拥有读写权限。更多信息,请参阅 管理个人访问令牌

    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 请求头,值为 2026-03-10

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

使用响应

发出请求后,API 将返回响应状态码、响应头,可能还有响应体。

关于响应代码和请求头

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

此外,响应还会包含提供更多细节的请求头。以 X-x- 开头的请求头为 GitHub 的自定义请求头。例如,x-ratelimit-remainingx-ratelimit-reset 请求头指示在一定时间内您还能发起多少请求。

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

例如,此请求获取 octocat/Spoon‑Knife 仓库中的 issue 列表

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 仓库中的 issue 列表

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 获取每个 issue 的标题和作者 ID

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

前两个命令的返回结果类似于

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

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

例如,您可以获取每个 issue 的标题和作者 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 获取每个 issue 的标题和作者 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 为了提升效率会在概要表示中省略这些属性。若需获取这些属性,请请求详细表示。

文档为每个 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"

速率限制

GitHub REST API 对在特定时间段内可发起的请求数量进行限制。有关速率限制以及如何检查当前速率限制状态的更多信息,请参阅 REST API 速率限制

后续步骤

本文演示了如何在仓库中列出和创建 issue。想进一步练习,可尝试对 issue 添加评论、编辑 issue 标题或关闭 issue。更多信息,请参阅 “创建 issue 评论”端点“更新 issue”端点

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

© . This site is unofficial and not affiliated with GitHub, Inc.