简介
本文介绍了如何使用 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 端点指定您应使用值为 application/vnd.github+json
的 Accept
标头。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 进行身份验证,请从您的终端运行以下命令。
gh auth login
您可以使用
--scopes
选项指定所需的范围。如果您想使用创建的令牌进行身份验证,则可以使用--with-token
选项。有关更多信息,请参阅GitHub CLIauth login
文档。 -
选择您要进行身份验证的位置
- 如果您在 GitHub.com 访问 GitHub,请选择GitHub.com。
- 如果您在其他域名访问 GitHub,请选择其他,然后输入您的主机名(例如:
octocorp.ghe.com
)。
-
按照屏幕上的其余提示操作。
当您选择 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
选项传递数字、布尔值或 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"
gh api --method GET /octocat \
--header 'Accept: application/vnd.github+json' \
--header "X-GitHub-Api-Version: 2022-11-28"
使用查询参数的请求示例
“列出公共事件”端点默认返回三十个问题。以下示例使用 per_page
查询参数改为返回两个问题而不是 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
后跟完整路径作为值。完整路径是一个 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: Bearer
或Authorization: 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"
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
查询参数仅获取第一页结果。
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 参考文档。