65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 代码访问 GitHub API

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2019年2月28日

CPOL

28分钟阅读

viewsIcon

47357

downloadIcon

3636

本文将提供 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 可用,连接过程就与之前描述的完全相同。

这个过程有点复杂,并且超出了本文的范围,但我们将至少提供一个简要概述以及一个非常详细描述的链接。基本流程如下:

  1. 您在 GitHub 上注册您的应用程序,并获得客户端标识和客户端密钥。这是一次性的。应用程序注册后,您将“硬编码”标识和密钥到您的应用程序代码中。
  2. 您的应用程序会重定向到一个 GitHub URL,指定一个随机生成的密钥和请求的权限。随机生成的密钥有助于防止跨站请求伪造。
  3. GitHub 会验证用户。
  4. GitHub URL 会重定向回您的网站,并提供相同的随机生成的密钥和一个授权码。
  5. 您的应用程序会验证随机生成的密钥。然后,它会通过指定客户端的标识、客户端密钥和授权码来创建一个授权码。
  6. 作为回报,您的应用程序会收到一个用于身份验证的 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。用于检索这些实体的每个方法是 SearchCodeSearchIssuesSearchLabelsSearchRepoSearchUsers

这些方法中的每一种都接受一个参数,该参数源自 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 类及其派生类:CodeSearcherIssueSearcherLabelSearcherRepositorySearcherUserSearcher

GitHub API Snippets 应用程序

还提供了一个简单的 Windows 控制台应用程序。通常,本文中的大多数代码示例来自该应用程序的 Program 类。应用程序的用户界面故意保持简单,以避免分散对 GitHub API 示例的注意力。

下面显示了一个示例会话。

延伸阅读

有关该主题的进一步阅读,以下链接提供了宝贵的信息:

© . All rights reserved.