使用 C# 代码访问 GitHub API





5.00/5 (10投票s)
本文将提供 C# 代码示例,介绍 GitHub API 的一些更常用功能。
概述
如果您进行编码,可能已经熟悉 GitHub。它是最流行的源代码管理解决方案之一。它提供了满足几乎所有常见需求的广泛功能。
许多人不知道的是,它还提供了一个相当强大的 API,用于以编程方式访问这些功能。本文将提供 C# 代码示例,介绍该 API 的一些更常用功能。
值得庆幸的是,GitHub 的开发人员已经创建了一个名为 Octokit 的 NuGet 包,用于处理 GitHub API V3 的大部分繁重工作。虽然它尚未完美,但它确实能完成工作。
此外,GitHub 目前(2019 年 2 月 6 日)正在 beta 测试一个名为 Octokit.GraphQL.net 的新框架,用于 GitHub API V4。然而,这超出了本文的范围。如果您想关注其进展,本文的“进一步阅读”部分提供了指向其 GitHub 存储库的链接。
更新: 截至 2021 年 8 月 13 日,GitHub 不再支持本文中描述并在演示应用程序中提供的“基本身份验证”机制。 更多详情请参阅以下链接:
https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/
示例应用程序
本文包含两个示例应用程序的源代码
- GitHubApiSnippets.sln – 此 Windows 控制台应用程序包含本文中的所有示例代码。可以在以下位置下载此应用程序的源代码:GitHubApiSnippets.zip。
- GitHubApiDemo.sln – 此 Windows 窗体应用程序允许用户在不编写代码的情况下尝试 GitHub API 搜索。可以在以下位置下载此应用程序的源代码:GitHubApiDemo.zip。
这两个应用程序均根据 CPOL 获得许可。
这两个应用程序均使用 Visual Studio 2017 Professional 开发和构建。但是,它们也应与 Visual Studio 2017 Community 以及任何更高版本的 Visual Studio 兼容。
本文末尾提供了对这两个应用程序的更详细描述。
入门
要使用 GitHub API,应用程序必须首先连接到它。有三种常见的连接方式:未经验证的访问、基本身份验证和 OAuth token 身份验证。对于所有这些连接类型,GitHub API 都会限制请求的频率,并单独限制搜索的频率和大小。
客户端标识
在所有情况下,客户端都需要自我标识。这是通过提供简单的文本标识来完成的。文本应为以下之一(按偏好顺序):产品名称、GitHub 组织或 GitHub 用户名。以下代码提供了一个示例。
var productInformation = new ProductHeaderValue(GitHubIdentity);
速率限制
GitHub API 对请求频率施加了一些严格的限制。已验证用户每小时限制 5000 次请求。未经验证的用户每小时限制 60 次请求。GitHub Enterprise 服务器的管理员可以按用户和按应用程序调整这些速率限制。有关更多信息,请参阅本文“进一步阅读”部分的“GitHub Enterprise – 配置速率限制”。
搜索限制
GitHub API 还对搜索请求施加了单独的限制。已验证用户每分钟限制 30 次搜索请求。未经验证的用户每分钟限制 10 次搜索请求。单个搜索也受其返回的项目数量的限制。搜索(可以分解为多个请求/页面)最多限制 1000 个项目。
未经验证的访问
最简单的访问方式是通过未经验证的客户端。然而,这种类型的客户端访问权限最少,并且速率限制最严格。除创建 OAuth token 外,不推荐使用。
var productInformation = new ProductHeaderValue(GitHubIdentity); var client = new GitHubClient(productInformation);
基本身份验证
要使用基本身份验证创建客户端,应用程序会与 GitHub 共享用户名和密码。这是一种简单的身份验证方式。它最可能被桌面应用程序使用。它唯一的缺点是应用程序至少暂时知道用户的 GitHub 凭据。对于 Web 应用程序,建议使用 OAuth token 身份验证。以下代码提供了一个基本身份验证示例。
var productInformation = new ProductHeaderValue(GitHubIdentity); var credentials = new Credentials(username, password, AuthenticationType.Basic); var client = new GitHubClient(productInformation) { Credentials = credentials };
OAuth Token 身份验证
使用 OAuth,用户会使用 GitHub 网站颁发的 token 进行身份验证。它的优点是应用程序永远不会知道用户的 GitHub 凭据。一旦 token 可用,连接过程就非常简单,类似于基本身份验证。以下代码提供了一个示例。
var productInformation = new ProductHeaderValue(GitHubIdentity); var credentials = new Credentials(token); var client = new GitHubClient(productInformation) { Credentials = credentials };
这种方法的复杂性源于创建 OAuth token 的必要性。对于命令行应用程序,用户可以直接创建访问 token。要执行此操作,请遵循此处的说明:https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/。
然而,不建议 Web 应用程序这样做。相反,Web 应用程序应使用下面描述的 OAuth Web 应用程序流。
OAuth Web 应用程序流
OAuth 最强大的地方在于 Web 应用程序。在这种情况下,您不会从 OAuth token 开始。相反,应用程序允许 GitHub 网站验证用户。然后,应用程序会为该用户请求一个 token。一旦 token 可用,连接过程就与之前描述的完全相同。
这个过程有点复杂,并且超出了本文的范围,但我们将至少提供一个简要概述以及一个非常详细描述的链接。基本流程如下:
- 您在 GitHub 上注册您的应用程序,并获得客户端标识和客户端密钥。这是一次性的。应用程序注册后,您将“硬编码”标识和密钥到您的应用程序代码中。
- 您的应用程序会重定向到一个 GitHub URL,指定一个随机生成的密钥和请求的权限。随机生成的密钥有助于防止跨站请求伪造。
- GitHub 会验证用户。
- GitHub URL 会重定向回您的网站,并提供相同的随机生成的密钥和一个授权码。
- 您的应用程序会验证随机生成的密钥。然后,它会通过指定客户端的标识、客户端密钥和授权码来创建一个授权码。
- 作为回报,您的应用程序会收到一个用于身份验证的 OAuth token,如前所述。
请求 token 的代码如下:
var client = new GitHubClient(new ProductHeaderValue(GitHubIdentity)); OauthToken tokenInfo = await client.Oauth.CreateAccessToken( new OauthTokenRequest(clientId, clientSecret, authenticationCode)); string token = tokenInfo.AccessToken;
Phil Haack 博客上的以下链接提供了 OAuth Web 应用程序流的详细描述,并提供了一个示例项目:https://haacked.com/archive/2014/04/24/octokit-oauth/。
GitHub Enterprise
连接到 GitHub Enterprise 实例几乎与之前描述的相同。只需提供一个附加参数:GitHub Enterprise 服务器的 URL。
var client = new GitHubClient(productInformation, new Uri(enterpriseUrl)) { Credentials = credentials };
顶级信息
如果您已经知道所需信息的标识,Octokit 通常会提供直接访问它的方法。否则,可能需要使用客户端的 Search
属性来搜索该信息。
本文的这一部分将讨论一些常见的顶级信息项。有时信息是从属于顶级信息的(例如,fork 从属于 repository)。
在这种情况下,通常仍然有一个(客户端中的)从属属性,允许您直接访问信息,而无需搜索。本文的“GitHubClient 属性”部分提供了这些从属属性的概述。
存储库
要直接访问 repository,而无需先搜索它,请使用 Get
方法。例如,要获取“octokit/octokit.net”repository
Repository repository = await client.Repository.Get("octokit", "octokit.net");
Repository Forks
客户端的 same Repository
属性也提供了对该 repository 从属信息的访问。因此,例如,以下代码获取“octokit/octokit.net”repository 的所有 forks
IReadOnlyList<Repository> allForks = await client.Repository.Forks.GetAll( "octokit", "octokit.net");
Repository Forks (带分页)
虽然前面的代码对于少量项目效果很好,但如果项目数量增长过大,它就会失败。大多数“get”方法(返回大量项目)支持一个可选参数(类型为 ApiOptions
)。此参数允许调用者分块(或分页)获取结果。
以下示例中的代码也获取“octokit/octokit.net”repository 的所有 forks,但这次实现了分页
var options = new ApiOptions { PageCount = 1, PageSize = 100, StartPage = 1 }; int maximumCount = options.PageCount.Value * options.PageSize.Value; Console.WriteLine("Repository.Forks.GetAll (Paging):"); while (true) { IReadOnlyList<Repository> forks = await client.Repository.Forks.GetAll( "octokit", "octokit.net", options); foreach (Repository fork in forks) Console.WriteLine($" {fork.Owner.Login}/{fork.Name}"); if (forks.Count < maximumCount) break; options.StartPage++; }
用户
要直接访问用户,而无需先搜索它,请使用 Get
方法,如下所示:
User user = await client.User.Get("octokit");
此方法使用相同的方法来获取具有个人和组织帐户类型的用户。
搜索
Octokit 框架提供了相对强大的搜索功能。API 可以搜索代码/文件、issues/pull requests、labels、repositories 和 users/organizations。
搜索结果被分解为页面。对这些方法中的任何一个的每次调用都将返回一页结果,默认情况下,该页面包含零到 100 个项目。
本文的这一部分提供了简要概述以及如何实现分页的示例。本文稍后在“Search Property”部分提供了对搜索条件的更详细描述。
代码
有时有必要在 repository 中搜索文件。在这种情况下,使用 SearchCode
方法来查找文件。
搜索文件
以下是一个简单的搜索请求,它在“octokit/octokit.net”repository 中查找包含文件路径中“issue”文本的第一个 100 个 C# 文件。
SearchCodeResult result = await client.Search.SearchCode( new SearchCodeRequest("issue") { In = new CodeInQualifier[] { CodeInQualifier.Path }, Language = Language.CSharp, Repos = new RepositoryCollection { "octokit/octokit.net" } });
搜索文件(带分页)
有时有必要查找 100 个以上的项目。Octokit 框架允许查找多达 1000 个项目。要使用此功能,有必要实现分页,这可以通过以下方式完成:
const int MaximumSearchItems = 1000; var request = new SearchCodeRequest { Language = Language.CSharp, Repos = new RepositoryCollection { "octokit/octokit.net" } }; int maximumPage = MaximumSearchItems / request.PerPage; for(request.Page = 1; request.Page <= maximumPage; request.Page++) { SearchCodeResult result = await client.Search.SearchCode(request); if (request.Page == 1) Console.WriteLine($"Search.SearchCode (Paging): TotalCount={result.TotalCount}"); foreach (SearchCode code in result.Items) Console.WriteLine($" {code.Path}"); if (result.IncompleteResults || result.Items.Count < request.PerPage) break; }
Issue
有时有必要在 repository 中搜索 issues。在这种情况下,使用 SearchIssue
方法来查找 issues。
以下是一个简单的搜索请求,它查找“octokit/octokit.net”repository 中标题包含“bug”文本的第一个 100 个 issues。
SearchIssuesResult result = await client.Search.SearchIssues( new SearchIssuesRequest("bug") { In = new IssueInQualifier[] { IssueInQualifier.Title }, Repos = new RepositoryCollection { "octokit/octokit.net" } });
Label
有时有必要在 repository 中搜索 labels。在这种情况下,SearchLabel
方法提供了有限的查找 labels 的能力。
以下是一个简单的搜索请求,它查找“octokit/octokit.net”repository 中以“category”文本开头的第一个 100 个 labels。
Repository repository = await client.Repository.Get("octokit", "octokit.net"); SearchLabelsResult result = await client.Search.SearchLabels( new SearchLabelsRequest("category", repository.Id));
存储库
有时有必要搜索 repositories。在这种情况下,使用 SearchRepo
方法来查找 repositories。
以下是一个简单的搜索请求,它查找包含 repository 名称中“octokit”文本的第一个 100 个 repositories。
SearchRepositoryResult result = await client.Search.SearchRepo( new SearchRepositoriesRequest("octokit") { In = new InQualifier[] { InQualifier.Name } });
用户
有时有必要搜索用户或组织。在这种情况下,使用 SearchUser
方法来查找用户或组织。
以下是一个简单的搜索请求,它查找(帐户类型为 User 的)第一个 100 个用户,这些用户在默认字段之一(用户登录名、全名或电子邮件地址)中包含“oct”文本。
SearchUsersResult result = await client.Search.SearchUsers( new SearchUsersRequest("oct") { AccountType = AccountSearchType.User });
注意:通过指定帐户类型为 Org
,可以进行类似的搜索以查找组织而不是个人用户。
GitHubClient 属性
在很大程度上,GitHub 客户端(GitHubClient
)被组织成一个属性层次结构,每个属性提供一个单独的接口,该接口与 GitHub 对象模型的单个元素相关。
因此,例如,要访问 GitHub repository,可以通过引用 Repository
属性来访问相关的 API(IRepositoriesClient
),如下所示:
Repository repository = await client.Repository.Get("octokit", "octokit.net");
要访问 repository 的从属元素(例如,branch),可以通过引用嵌套的 Repository.Branch
属性来访问相关的 API(IRepositoryBranchesAPI
),如下所示:
Branch branch = await client.Repository.Branch.Get("octokit", "octokit.net", "master");
这个模式有几个例外。一个例外是前面讨论的 Search
属性,它提供了对搜索 API(ISearchClient
)的访问。另一个例外是 Miscellaneous
属性,它提供了对杂项 API(IMiscellaneousClient
)的访问。这两个 API 都处理对象模型的多个元素。
下表提供了 GitHubClient
属性层次结构的概述,这些属性提供了对相关 API 的访问。
成员名称 | 描述 | ||
Activity | 管理 GitHub 的“社交”方面,如 events、Atom Feeds、评论通知、repository 关注和被关注 repository 的 events。 | ||
事件 | 列出各种 GitHub 实体(例如,组织和 repository)发生的 events。 | ||
Feeds | 列出已验证用户可用的 Atom feeds。 | ||
Notifications | 列出对话和评论的通知,将它们标记为已读,并管理已验证用户对它们的订阅。 | ||
Starring | 管理 repository 的 starring(书签),并列出有关书签 repository 的信息。 | ||
Watching | 注册以接收所选 repository 的讨论和 events 的通知。 | ||
Authorization | 管理用户、组织或应用程序的授权(授予、撤销等)。 | ||
Check | 管理 commits 的 check runs/suites,并从中获取结果。 | ||
Run | 管理 commits 的 check runs,并从中获取这些 check runs 的结果。 | ||
Suite | 管理 commits 的 check runs 的 suite,并从中获取这些 suites 的结果。 | ||
企业版 | 管理 GitHub Enterprise 并列出有关它的信息。 | ||
AdminStats | 列出 GitHub Enterprise 的管理统计信息(主要是全局计数器)。 | ||
Ldap | 管理 GitHub Enterprise 用户和团队与 LDAP 服务器的同步。 | ||
许可证 | 获取 GitHub Enterprise 的许可信息。 | ||
Organization | 为 GitHub Enterprise 创建组织(例如,部门)。 | ||
PreReceiveEnvironment | 管理 GitHub Enterprise 的 pre-receive 环境。 | ||
SearchIndexing | 为 GitHub Enterprise 队列搜索索引作业。 | ||
Gist | 管理 GitHub Gists(代码片段、笔记、待办事项列表等)。 | ||
注释 | 管理 Gists 的评论。 | ||
Git | 更直接地访问 GitHub 上的 Git 数据库(例如,读取/写入原始 Git 对象)。 | ||
Blob | 管理 Git 数据库中的 blobs(二进制大对象)。 | ||
Commit | 管理 Git 数据库中的 Git commits。 | ||
参考 | 管理 Git 数据库中的 Git references。 | ||
Tag | 管理 Git 数据库中的 Git tags。 | ||
Tree | 管理 Git 数据库中的 Git trees。 | ||
GitHubApps | 获取有关 GitHub 应用程序及其安装的信息。 | ||
安装 | 获取有关 GitHub 应用程序安装的信息。 | ||
Issue | 管理和列出 repository 的 issues(bug 报告、改进建议、问题等)。 | ||
Assignee | 管理和列出分配给 issue 的用户。 | ||
注释 | 管理和列出与 issue 相关的评论。 | ||
事件 | 列出与 issue 相关的 events。 | ||
Labels | 管理和列出与 issue 相关的 labels。 | ||
Milestones | 管理和列出与 issue 相关的 milestones。 | ||
Timelines | 管理和列出与 issue 相关的 timeline events。 | ||
Migration | 管理和列出 GitHub 与外部系统之间的迁移。 | ||
Migrations | 管理和列出 GitHub 与外部系统之间的迁移。 | ||
杂项 | 列出未包含在其他 API 中的杂项信息和元数据(例如,可用的 emojis)。 | ||
OAuth | 创建 OAuth (Open Authorization) 访问 token 并获取 GitHub 登录 URL。 | ||
Organization | 管理和列出组织(用户组)。 | ||
成员 | 管理和列出属于组织的成员(用户)。 | ||
OutsideCollaborator | 管理和列出组织的外部协作者(用户)。 | ||
团队 | 管理和列出组织的团队(用户组)。 | ||
PullRequest | 管理和列出 repository 的 pull requests。 | ||
评估 | 管理和列出 pull request 的 reviews。 | ||
ReviewComment | 管理和列出 pull request 的 review comments。 | ||
ReviewRequest | 管理和列出 pull request 的 review requests。 | ||
Reaction | 管理和列出对 commit comments、issues、issue comments 和 pull request review comments 的 reactions。reaction 是简单的用户反馈,表示赞成或不赞成(例如,竖起大拇指、竖起大拇指、困惑等)。 | ||
CommitComment | 管理和列出 commit comment 的 reactions。 | ||
Issue | 管理和列出 issue 的 reactions。 | ||
IssueComment | 管理和列出 issue comment 的 reactions。 | ||
PullRequestReviewComment | 管理和列出 pull request review comment 的 reactions。 | ||
存储库 | 管理和列出 repositories。 | ||
Branch | 管理和列出 repository 的 branches。 | ||
Collaborator | 管理和列出协作 repository 的用户。 | ||
注释 | 管理和列出与 repository 相关的评论。 | ||
Commit | 列出并比较与 repository 相关的 commits。 | ||
Content | 管理和列出与 repository 相关的 content(文件等)。 | ||
DeployKeys | 管理和列出与 repository 相关的 deployment keys。 | ||
部署 | 管理和列出 repository 的 deployments。 | ||
状态 | 管理和列出 repository deployments 的状态。 | ||
Forks | 管理和列出 repository 的 forks。 | ||
钩子 (Hooks) | 管理和列出 repository 的 webhooks(事件订阅)。 | ||
Invitation | 管理和列出邀请协作 repository 的用户。 | ||
合并 (Merging) | 合并 repository 中的 branches。 | ||
页面 | 为 repository 列出并构建网页。 | ||
项目 | 管理和列出 repository 或组织的 project boards。值得注意的是,这个 API 放在 repository API 下比较不寻常,因为为组织创建的项目板可能没有相关的 repository。 | ||
Card | 管理和列出 project board 的 cards(注释的 issues/pull requests)。 | ||
Column | 管理和列出 project board 的 columns。Columns 用于对相关的 project cards 进行分组。 | ||
PullRequest | 管理和列出 repository 的 pull requests。 | ||
评估 | 管理和列出 pull request 的 reviews。 | ||
ReviewComment | 管理和列出 pull request 的 review comments。 | ||
ReviewRequest | 管理 pull request 的 review requests 列表。 | ||
Release | 管理和列出 repository 的 releases。 | ||
统计 | 获取 repository 的统计信息(主要是计数器)。 | ||
状态 | 管理 repository 引用(branch、tag 等)的状态。 | ||
Traffic | 列出 repository 的 traffic/usage 统计信息(和信息)。 | ||
搜索 | 搜索 GitHub 实体,如 code、issues/pull requests、labels、repositories 和 users/organizations。 | ||
用户 | 管理和列出 users。 | ||
Administration | 管理(创建、删除等)用户并列出有关用户的某些管理信息。 | ||
Emails | 管理和列出已验证用户的电子邮件地址。 | ||
Followers | 管理和列出关注某个用户的其他用户。 | ||
GitSshKey | 管理和列出用户的 public keys(SSH/Secure Shell)。 | ||
GpgKey | 管理和列出用户的 GPG (GNU Privacy Guard) keys。 |
虽然在介绍性文章中涵盖 Octokit.net 框架的全部内容超出了范围,但本文的其余部分将简要概述表中选定的属性。
Issue Property
要直接访问 issue,而无需先搜索它,请使用 Get
方法。例如,要获取“octokit/octokit.net”repository 中的 issue 号 1
Issue issue = await client.Issue.Get("octokit", "octokit.net", 1);
Repository Property
要直接访问 repository,而无需先搜索它,请使用 Get
方法。例如,要获取“octokit/octokit.net”repository
Repository repository = await client.Repository.Get("octokit", "octokit.net");
客户端的 same Repository
属性也提供了对该 repository 从属信息的访问。因此,例如,以下代码获取“octokit/octokit.net”repository 的“master”分支
Branch branch = await client.Repository.Branch.Get("octokit", "octokit.net", "master");
Search Property
Search
属性提供了对 ISearchClientAPI
接口的访问,该接口支持五种不同实体的搜索:code/files、issues/pull requests、labels、repositories 和 users/organizations。用于检索这些实体的每个方法是 SearchCode
、SearchIssues
、SearchLabels
、SearchRepo
和 SearchUsers
。
这些方法中的每一种都接受一个参数,该参数源自 BaseSearchRequest
类,用于指定搜索条件。搜索结果被分成一个或多个搜索结果页面。
对这些方法中的任何一个的每次调用都将返回一页结果,默认情况下,该页面包含零到 100 个项目。
在检索第一页之前,可以通过设置 PerPage
属性来调整(每个页面中的)项目最大数量。要前进到后续的页面结果,只需递增 Page
属性并使用相同的条件进行后续调用。
BaseSearchRequest
类中存在的所有搜索类型共有的属性如下:
属性 | 描述 |
Order | 对项目进行排序的顺序(升序或降序)。 |
页面 | 基于 1 的页码。对任一搜索方法的每次调用都返回一页项目。PerPage 属性指示每次调用返回的最大项目数。在进行后续调用之前,调用者通过递增 Page 属性的值来前进页面。Page 属性的默认值为 1,表示默认返回第一页项目。 |
参数 | 一个名称/值对的字典,这些对作为查询字符串参数附加到 GitHub API 的 URL。通常,调用者应将此字典视为只读。派生类的各种属性将间接代表调用者修改此字典。 |
PerPage | 每页的项目数。这是通过对其中一个搜索方法进行一次调用最多返回的项目数。PerPage 属性的默认值为 100。 |
Sort | 按指定的字段对搜索结果进行排序。此只读属性通过派生类中的 SortField 属性间接设置。 |
术语 | 将搜索结果限制为包含指定文本的项目。此只读属性通过请求类的构造函数间接设置。 |
SearchCode 方法
调用 SearchCode
方法时,SearchCodeRequest
类公开了以下条件。这些属性是 BaseSearchRequest
类(它派生自该类)提供的属性的补充。注意:初始化所有这些属性的示例代码在此表格之后。
属性 | 描述 |
Extension | 将搜索结果限制为具有指定文件扩展名的代码。 |
FileName | 将搜索结果限制为具有指定文件名的代码。 |
Forks | 一个值,用于确定搜索结果是否包含 fork repository 中的代码。 |
In | 将搜索结果限制为指定字段包含搜索词 (Term ) 的代码。 |
语言 | 将搜索结果限制为用指定编程语言编写的代码。 |
Organization | 将搜索结果限制为指定组织的组织代码。 |
Path | 将搜索结果限制为指定文件路径中的代码。 |
Repos | 将搜索结果限制为指定 repository 集合中的代码,并为每个单独的 repository 使用“owner/name”格式。 |
大小 | 将搜索结果限制为大小(以字节为单位)在指定范围内的代码。 |
SortField | 按指定的字段对搜索结果进行排序。 |
用户 | 将搜索结果限制为指定用户查找的代码。 |
SearchCode(简单搜索)
以下是一个简单的搜索请求,它在“octokit/octokit.net”repository 中查找文件路径中包含“issue”文本的第一个 100 个文件。
SearchCodeResult result = await client.Search.SearchCode( new SearchCodeRequest("issue") { In = new CodeInQualifier[] { CodeInQualifier.Path }, Language = Language.CSharp, Repos = new RepositoryCollection { "octokit/octokit.net" } });
SearchCode(所有字段)
以下代码示例演示了初始化一个请求(SearchCodeRequest
),其中设置了所有属性。
int fromNumber = 100; int toNumber = 1000; string extension = ".cs"; string fileName = "IssueCommentPayload"; string organization = "octokit"; string path = "Octokit/Models/Response/ActivityPayloads"; string repository = "octokit/octokit.net"; string term = "issue"; string user = "octokit"; var request = new SearchCodeRequest(term) { Extension = extension, FileName = fileName, Forks = false, In = new CodeInQualifier[] { CodeInQualifier.Path }, Language = Language.CSharp, Order = SortDirection.Descending, Organization = organization, Path = path, Repos = new RepositoryCollection { repository }, Size = new Range(fromNumber, toNumber), SortField = CodeSearchSort.Indexed, User = user };
SearchIssues 方法
调用 SearchIssues
方法时,SearchIssuesRequest
类公开了以下条件。这些属性是 BaseSearchRequest
类(它派生自该类)提供的属性的补充。注意:初始化所有这些属性的示例代码在此表格之后。
属性 | 描述 | |
Archived | 一个值,用于确定搜索结果是否仅限于已存档或仅限于未存档 repository 中的 issues。默认包括已存档和未存档 repository。 | |
Assignee | 将搜索结果限制为分配给指定用户的 issues。 | |
作者 | 将搜索结果限制为由指定用户创建的 issues。 | |
Base | 将搜索结果限制为基于它们正在合并到的分支的 issues。 | |
Closed | 将搜索结果限制为在指定日期范围内关闭的 issues。 | |
Commenter | 将搜索结果限制为由指定用户评论的 issues。 | |
注释 | 将搜索结果限制为评论数量在指定范围内的 issues。 | |
Created | 将搜索结果限制为在指定日期范围内创建的 issues。 | |
Exclusions | 将搜索结果限制为排除指定的条件。 | |
Assignee | 排除分配给指定用户的 issues。 | |
作者 | 排除由指定用户创建的 issues。 | |
Base | 排除基于它们正在合并到的分支的 issues。 | |
Commenter | 排除由指定用户评论的 issues。 | |
Head | 排除源自指定分支的 issues。 | |
Involves | 排除分配给、由...创建、评论或提及指定用户的 issues。 | |
Labels | 排除具有指定 labels 的 issues。 | |
语言 | 排除位于与指定编程语言匹配的 repository 中的 issues。 | |
Mentions | 排除提及指定用户的 issues。 | |
Milestone | 排除具有指定 milestone 的 issues。 | |
状态 | 排除指定状态(例如,open 或 closed)的 issues。 | |
状态 | 排除具有指定 commit 状态(例如,pending、success、error、failure 等)的 issues。 | |
Head | 将搜索结果限制为源自指定分支的 issues。 | |
In | 将搜索结果限制为指定字段包含搜索词 (Term ) 的 issues。 | |
Involves | 将搜索结果限制为分配给、由...创建、评论或提及指定用户的 issues。 | |
Is | 将搜索结果限制为与一个或多个指定状态匹配的 issues。例如,open、closed、merged、unmerged 等 issues。 | |
Labels | 将搜索结果限制为具有指定 labels 的 issues。labels 以逗号分隔的列表形式指定。 | |
语言 | 将搜索结果限制为位于与指定编程语言匹配的 repository 中的 issues。 | |
Mentions | 将搜索结果限制为提及指定用户的 issues。 | |
Merged | 将搜索结果限制为在指定日期范围内合并的 issues。 | |
Milestone | 将搜索结果限制为具有指定 milestone 的 issues。 | |
否 | 将搜索结果限制为缺少指定元数据的 issues。例如,缺少 label、milestone 或分配用户的 issues。 | |
Repos | 将搜索结果限制为指定 repository 集合中的 issues,并为每个单独的 repository 使用“owner/name”格式。 | |
SortField | 按指定的字段对搜索结果进行排序。 | |
状态 | 将搜索结果限制为指定状态(例如,open 或 closed)的 issues。 | |
状态 | 将搜索结果限制为具有指定 commit 状态(例如,pending、success、error、failure 等)的 issues。 | |
团队 | 将搜索结果限制为提及指定团队(在组织内)的 issues。 | |
类型 | 将搜索结果限制为指定类型(例如,issues 或 pull requests)的 issues。 | |
更新时间 | 将搜索结果限制为在指定日期范围内更新的 issues。 | |
用户 | 将搜索结果限制为由指定用户拥有的 repository 中的 issues。 |
SearchIssues(简单搜索)
以下是一个简单的搜索请求,它查找“octokit/octokit.net”repository 中标题包含“bug”文本的第一个 100 个 issues。
SearchIssuesResult result = await client.Search.SearchIssues( new SearchIssuesRequest("bug") { In = new IssueInQualifier[] { IssueInQualifier.Title }, Repos = new RepositoryCollection { "octokit/octokit.net" } });
SearchIssues
方法确实支持跨多个 repository 进行搜索的能力。但是,它的实用性有限。目前(2019 年 2 月 6 日),结果 issues 的 Repository
属性未被填充。因此,无法确定结果 issue 指的是哪个 repository。
在 API 修复此问题之前,建议将搜索限制为单个 repository(如上面的示例所示)。
SearchIssues(所有字段)
以下代码示例演示了初始化一个请求,其中设置了所有属性。虽然搜索本身没有意义,但它提供了复杂的初始化的有效示例。
var fromDate = new DateTime(2018, 3, 17); var toDate = new DateTime(2019, 3, 17); int fromNumber = 1; int toNumber = 10; string branch = "master"; string excludedBranch = "other"; string excludedLabel = "wth"; string excludedMilestone = "Nothing Done"; string excludedUser = "somebody"; string label = "up-for-grabs"; string milestone = "API Cleanup"; string repository = "octokit/octokit.net"; string term = "bug"; string user = "octokit"; var request = new SearchIssuesRequest(term) { Archived = true, Assignee = user, Author = user, Base = branch, Closed = new DateRange(fromDate, toDate), Commenter = user, Comments = new Range(fromNumber, toNumber), Created = new DateRange(fromDate, SearchQualifierOperator.GreaterThan), Exclusions = new SearchIssuesRequestExclusions { Assignee = excludedUser, Author = excludedUser, Base = excludedBranch, Commenter = excludedUser, Head = branch, Involves = excludedUser, Labels = new string[] { excludedLabel }, Language = Language.Ada, Mentions = excludedUser, Milestone = excludedMilestone, State = ItemState.Open, Status = CommitState.Error }, Head = branch, In = new IssueInQualifier[] { IssueInQualifier.Title }, Involves = user, Is = new IssueIsQualifier[] { IssueIsQualifier.Public }, Labels = new string[] { label }, Language = Language.CSharp, Mentions = user, Merged = new DateRange(toDate, SearchQualifierOperator.LessThan), Milestone = milestone, No = IssueNoMetadataQualifier.Assignee, Order = SortDirection.Descending, Repos = new RepositoryCollection() { repository }, SortField = IssueSearchSort.Created, State = ItemState.Closed, Status = CommitState.Success, Type = IssueTypeQualifier.Issue, Updated = new DateRange(toDate, SearchQualifierOperator.LessThanOrEqualTo), User = user };
SearchLabels 方法
调用 SearchLabels
方法时,SearchLabelsRequest
类公开了以下条件。这些属性是 BaseSearchRequest
类(它派生自该类)提供的属性的补充。注意:初始化所有这些属性的示例代码在此表格之后。
属性 | 描述 |
RepositoryId | 将搜索结果限制为具有指定唯一标识的 repository 中的 labels。 |
SortField | 按指定的字段对搜索结果进行排序。 |
SearchLabels(简单搜索)
与其他搜索方法相比,SearchLabels
方法不太友好且不太有用,原因如下:
- 它要求您已预先找到 repository 的唯一标识。
- 它的几乎所有条件都是必需的(而不是可选的)。
- 它提供了非常有限的条件。
- 虽然可用,但使用无参数构造函数将导致无效请求,因为需要搜索词但未提供。
以下是一个简单的搜索请求,它查找“octokit/octokit.net”repository 中以“category”文本开头的第一个 100 个 labels。
Repository repository = await client.Repository.Get("octokit", "octokit.net"); SearchLabelsResult result = await client.Search.SearchLabels( new SearchLabelsRequest("category", repository.Id));
SearchLabels(所有字段)
以下代码示例演示了初始化一个请求,其中设置了所有属性。
string term = "category"; Repository repository = await client.Repository.Get("octokit", "octokit.net"); var request = new SearchLabelsRequest(term, repository.Id) { Order = SortDirection.Descending, SortField = LabelSearchSort.Created };
SearchRepo 方法
调用 SearchRepo
方法时,SearchRepositoriesRequest
类公开了以下条件。这些属性是 BaseSearchRequest
类(它派生自该类)提供的属性的补充。注意:初始化所有这些属性的示例代码在此表格之后。
属性 | 描述 |
Archived | 一个值,用于确定搜索结果是否仅限于已存档或仅限于未存档 repository。默认包括已存档和未存档 repository。 |
Created | 将搜索结果限制为在指定日期范围内创建的 repositories。 |
分叉 | 一个值,用于确定搜索结果是否包含 fork repository。 |
Forks | 将搜索结果限制为 fork 数量在指定范围内的 repositories。 |
In | 将搜索结果限制为指定字段包含搜索词 (Term ) 的 repositories。 |
语言 | 将搜索结果限制为与指定编程语言匹配的 repositories。 |
大小 | 将搜索结果限制为大小(以千字节为单位)在指定范围内的 repositories。 |
SortField | 按指定的字段对搜索结果进行排序。 |
Stars | 将搜索结果限制为 stars 数量在指定范围内的 repositories。 |
更新时间 | 将搜索结果限制为在指定日期范围内更新的 repositories。 |
用户 | 将搜索结果限制为由指定用户拥有的 repositories。 |
SearchRepo(简单搜索)
以下是一个简单的搜索请求,它查找包含 repository 名称中“octokit”文本的第一个 100 个 repositories。
SearchRepositoryResult result = await client.Search.SearchRepo( new SearchRepositoriesRequest("octokit") { In = new InQualifier[] { InQualifier.Name } });
SearchRepo(所有字段)
以下代码示例演示了初始化一个请求,其中设置了所有属性。
var fromDate = new DateTime(2012, 3, 17); var toDate = new DateTime(2019, 3, 17); int fromNumber = 1; int toNumber = 10000; string term = "octokit"; string user = "octokit"; var request = new SearchRepositoriesRequest(term) { Archived = false, Created = new DateRange(fromDate, toDate), Fork = ForkQualifier.IncludeForks, Forks = new Range(fromNumber, toNumber), In = new InQualifier[] { InQualifier.Name }, Language = Language.CSharp, Order = SortDirection.Descending, Size = new Range(fromNumber, SearchQualifierOperator.GreaterThan), SortField = RepoSearchSort.Stars, Stars = new Range(fromNumber, SearchQualifierOperator.GreaterThanOrEqualTo), Updated = new DateRange(fromDate, SearchQualifierOperator.GreaterThan), User = user };
SearchUsers 方法
调用 SearchUser
方法时,SearchUsersRequest
类公开了以下条件。这些属性是 BaseSearchRequest
类(它派生自该类)提供的属性的补充。注意:初始化所有这些属性的示例代码在此表格之后。
属性 | 描述 |
AccountType | 将搜索结果限制为具有指定帐户类型(例如,个人或组织)的用户。 |
Created | 将搜索结果限制为在指定日期范围内创建的用户。 |
Followers | 将搜索结果限制为具有指定 follower 数量的用户。 |
In | 将搜索结果限制为指定字段包含搜索词 (Term ) 的用户。 |
语言 | 将搜索结果限制为拥有与指定编程语言匹配的 repository 的用户。 |
Location | 将搜索结果限制为位于指定位置的用户。 |
存储库 | 将搜索结果限制为拥有指定数量 repository 的用户。 |
SortField | 按指定的字段对搜索结果进行排序。 |
SearchUsers(简单搜索)
以下是一个简单的搜索请求,它查找(帐户类型为 User
的)第一个 100 个用户,这些用户在默认字段之一(用户登录名、全名或电子邮件地址)中包含“oct”文本。
SearchUsersResult result = await client.Search.SearchUsers( new SearchUsersRequest("oct") { AccountType = AccountSearchType.User });
注意:通过指定帐户类型为 Org
,可以进行类似的搜索以查找组织而不是个人用户。
SearchUsers(所有字段)
以下代码示例演示了初始化一个请求,其中设置了所有属性。
var fromDate = new DateTime(2001, 3, 17); int fromNumber = 1; int toNumber = 1000; string location = "Ontario"; var request = new SearchUsersRequest("code") { AccountType = AccountSearchType.User, Created = new DateRange(fromDate, SearchQualifierOperator.GreaterThan), Followers = new Range(fromNumber, SearchQualifierOperator.GreaterThanOrEqualTo), In = new UserInQualifier[] { UserInQualifier.Username }, Language = Language.CSharp, Location = location, Order = SortDirection.Descending, Repositories = new Range(fromNumber, toNumber), SortField = UsersSearchSort.Followers };
User Property
要直接访问用户,而无需先搜索它,请使用 Get
方法,如下所示:
User user = await client.User.Get("octokit");
此方法使用相同的方法来获取具有个人和组织帐户类型的用户。
GitHub API 演示应用程序
本文包含一个简单的 Windows 窗体应用程序,用于演示使用 Octokit.net 框架进行搜索。此应用程序仅用于演示搜索并提供一些代码示例。它不用于生产应用程序,也未经生产目的测试。
当应用程序首次启动时,将提示您输入 GitHub 凭据。登录屏幕支持三种类型的身份验证:未经验证的访问、基本身份验证和 OAuth Token 身份验证。
要进行搜索,请单击“Edit…Find…”并选择要搜索的项目。
填写搜索条件并单击 OK。下面,我们搜索一个包含“octokit”文本的 repository。
结果将显示在如下所示的数据网格中:
默认情况下,仅显示最少的信息。可以更改显示的信息列及其顺序。要执行此操作,请单击“Edit…Select Columns…”…
将出现一个对话框,允许您选择和排序列。
此外,通过双击数据网格中的任何项目,可以在“Detail”选项卡中查看更多详细信息…
该应用程序包含许多其他功能供用户玩。从 GitHub 的角度来看,该应用程序是只读的。因此,使用起来相对安全。
大部分代码涉及用户交互。在代码中,GitHub API 的使用仅限于 Searcher
类及其派生类:CodeSearcher
、IssueSearcher
、LabelSearcher
、RepositorySearcher
和 UserSearcher
。
GitHub API Snippets 应用程序
还提供了一个简单的 Windows 控制台应用程序。通常,本文中的大多数代码示例来自该应用程序的 Program
类。应用程序的用户界面故意保持简单,以避免分散对 GitHub API 示例的注意力。
下面显示了一个示例会话。
延伸阅读
有关该主题的进一步阅读,以下链接提供了宝贵的信息:
- Octokit.net 文档
https://octokitnet.readthedocs.io/en/latest/ - OAuth Flow
https://octokitnet.readthedocs.io/en/latest/oauth-flow/ - 授权 OAuth Apps
https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/ - GitHub Rest API V3
https://developer.github.com/v3/ - GitHub Glossary
https://help.github.com/articles/github-glossary/ - Octokit.net Source Code Repository (on GitHub)
https://github.com/octokit/octokit.net - GitHub Enterprise – 配置速率限制
https://help.github.com/enterprise/2.16/admin/guides/installation/configuring-rate-limits/ - Octokit.GraphQL.net Source Code Repository (on GitHub)
https://github.com/octokit/octokit.graphql.net - Microsoft completes GitHub Acquisition
https://blogs.microsoft.com/blog/2018/10/26/microsoft-completes-github-acquisition/ - GitHub Guides – Hello World
https://guides.github.com/activities/hello-world/ - GitHub Guides – Git Handbook
https://guides.github.com/introduction/git-handbook/