简介
本文介绍如何使用 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+json
和 application/json
。
您可以使用某些端点使用自定义媒体类型。例如,用于管理 提交 和 拉取请求 的 REST API 支持媒体类型 diff
、patch
和 sha
。媒体类型 full
、raw
、text
或 html
由其他一些端点使用。
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. 身份验证
-
通过从您的终端运行此命令来对 GitHub 进行身份验证。
Shell gh auth login
gh auth login
您可以使用
--scopes
选项来指定您想要的范围。如果您想使用您创建的令牌进行身份验证,可以使用--with-token
选项。有关更多信息,请参阅 GitHub CLIauth login
文档。 -
按照屏幕上的提示操作。
当您选择 HTTPS 作为 Git 操作的首选协议并回答“是”以确认您是否要使用您的 GitHub 凭据对 Git 进行身份验证时,GitHub CLI 会自动为您存储您的 Git 凭据。这很有用,因为它允许您使用
git push
和git pull
等 Git 命令,而无需设置单独的凭据管理器或使用 SSH。
3. 为您的请求选择一个端点
-
选择一个端点来发出请求。您可以探索 GitHub 的 REST API 文档 来发现您可以用来与 GitHub 交互的端点。
-
确定端点的 HTTP 方法和路径。您将使用这些方法和路径发送您的请求。有关更多信息,请参阅“HTTP 方法”和“路径”。
例如,“创建问题”端点 使用 HTTP 方法
POST
和路径/repos/{owner}/{repo}/issues
。 -
确定任何必需的路径参数。必需的路径参数出现在端点路径中的花括号
{}
中。用所需的值替换每个参数占位符。有关更多信息,请参阅“路径”。例如,“创建问题”端点 使用路径
/repos/{owner}/{repo}/issues
,路径参数为{owner}
和{repo}
。要在您的 API 请求中使用此路径,请将{repo}
替换为您要创建新问题的存储库的名称,并将{owner}
替换为拥有该存储库的帐户的名称。
4. 使用 GitHub CLI 发出请求
使用 GitHub CLI 的 api
子命令发出您的 API 请求。有关更多信息,请参阅 GitHub CLI api
文档。
在您的请求中,指定以下选项和值
-
--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 艺术。
gh api --method GET /octocat \ --header 'Accept: application/vnd.github+json' \ --header "X-GitHub-Api-Version: 2022-11-28"
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
查询参数仅获取第一页结果。
gh api --method GET /events -F per_page=2 -F page=1 --header 'Accept: application/vnd.github+json' \
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' \
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. 选择请求的端点
-
选择一个端点来发出请求。您可以探索 GitHub 的 REST API 文档 来发现您可以用来与 GitHub 交互的端点。
-
确定端点的 HTTP 方法和路径。您将使用这些方法和路径发送您的请求。有关更多信息,请参阅“HTTP 方法”和“路径”。
例如,“创建问题”端点 使用 HTTP 方法
POST
和路径/repos/{owner}/{repo}/issues
。 -
确定任何必需的路径参数。必需的路径参数出现在端点路径中的花括号
{}
中。用所需的值替换每个参数占位符。有关更多信息,请参阅“路径”。例如,“创建问题”端点 使用路径
/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: Bearer
或Authorization: token
传递令牌。但是,如果您正在传递 JSON Web 令牌 (JWT),则必须使用Authorization: Bearer
。有关更多信息,请参阅“身份验证”。有关使用Authorization
标头的请求示例,请参阅“使用主体参数的示例请求”。
-
--data
或-d
后跟 JSON 对象中的任何主体参数。如果您不需要在请求中指定任何主体参数,请省略此选项。有关更多信息,请参阅“主体参数”。有关示例,请参阅“使用主体参数的示例请求”。
示例请求
以下示例请求使用 "获取 Octocat" 端点 返回 Octocat 的 ASCII 艺术。
curl --request GET \ --url "https://api.github.com/octocat" \ --header "Accept: application/vnd.github+json" \ --header "X-GitHub-Api-Version: 2022-11-28"
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
查询参数仅获取第一页结果。
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
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" }'
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. 选择请求的端点
-
选择一个端点来发出请求。您可以探索 GitHub 的 REST API 文档 来发现您可以用来与 GitHub 交互的端点。
-
确定端点的 HTTP 方法和路径。您将使用这些方法和路径发送您的请求。有关更多信息,请参阅“HTTP 方法”和“路径”。
例如,“创建问题”端点 使用 HTTP 方法
POST
和路径/repos/{owner}/{repo}/issues
。 -
确定任何必需的路径参数。必需的路径参数出现在端点路径中的花括号
{}
中。用所需的值替换每个参数占位符。有关更多信息,请参阅“路径”。例如,“创建问题”端点 使用路径
/repos/{owner}/{repo}/issues
,路径参数为{owner}
和{repo}
。要在您的 API 请求中使用此路径,请将{repo}
替换为您要创建新问题的存储库的名称,并将{owner}
替换为拥有该存储库的帐户的名称。
3. 创建访问令牌
创建访问令牌以验证您的请求。您可以保存令牌并将其用于多个请求。为令牌提供访问端点所需的任何范围或权限。您将在请求中使用 Authorization
标头发送此令牌。有关更多信息,请参阅“身份验证”。
4. 使用 Octokit.js 发出请求
-
在您的脚本中导入
octokit
。例如,import { Octokit } from "octokit";
。有关导入octokit
的其他方法,请参阅 Octokit.js 自述文件。 -
使用您的令牌创建
Octokit
的实例。将YOUR-TOKEN
替换为您的令牌。JavaScript const octokit = new Octokit({ auth: 'YOUR-TOKEN' });
const octokit = new Octokit({ auth: 'YOUR-TOKEN' });
-
使用
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", });
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", }, });
await octokit.request("GET /octocat", { headers: { "content-type": "text/plain", "X-GitHub-Api-Version": "2022-11-28", }, });
- 将 HTTP 方法和路径作为第一个参数传递给
使用响应
在您发出请求后,API 将返回响应状态码、响应头和潜在的响应主体。
关于响应码和头
每个请求都会返回一个 HTTP 状态码,指示响应的成功与否。有关响应代码的更多信息,请参阅 MDN HTTP 响应状态码文档。
此外,响应将包含提供有关响应的更多详细信息的头。以 X-
或 x-
开头的头是 GitHub 的自定义头。例如,x-ratelimit-remaining
和 x-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
替换为存储库的名称。
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}`) }
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
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
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
替换为存储库的名称。
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}`) }
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
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
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 参考文档。