简介
本文介绍如何使用 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 文档”。
例如,“列出公共事件”端点默认返回 30 个问题。您可以使用 per_page
查询参数返回 2 个问题而不是 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
选项传递数字、布尔值或 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
属性的值是一个对象,其中标头名称作为键,标头值作为值。例如,以下代码将发送一个
content-type
标头,其值为text/plain
,以及一个X-GitHub-Api-Version
标头,其值为2022-11-28
。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 文档。
详细表示与摘要表示
响应可以包含资源的所有属性,也可以只包含属性的子集,具体取决于您是获取单个资源还是获取资源列表。
- 当您获取单个资源(例如特定存储库)时,响应通常会包含该资源的所有属性。这是资源的“详细”表示。
- 当您获取资源列表(例如多个存储库的列表)时,响应将只包含每个资源的属性子集。这是资源的“摘要”表示。
请注意,授权有时会影响表示中包含的详细信息量。
这是因为某些属性的计算成本很高,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 参考文档。