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

适用于 .NET 的 Google Code 问题跟踪器 API

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (2投票s)

2010年1月9日

Apache

5分钟阅读

viewsIcon

27276

downloadIcon

329

适用于 .NET 的 Google Code 问题跟踪器客户端库。

引言

适用于 .NET 的 Google Code 问题跟踪器客户端库将允许 .NET 应用程序在 Google Code 项目托管服务中查看/更新问题。使用此库,任何 .NET 客户端应用程序都可以执行以下操作:

  1. 获取项目的所有问题。
  2. 向项目提交新问题。
  3. 获取与项目相关的所有评论。
  4. 在问题上创建新评论。

代码采用纯 C# 3.0 编写,但库兼容 .NET 2.0。该项目托管在 http://code.google.com/p/google-code-issue-tracker/。请访问那里获取最新更新。

背景

本项目与 Google 没有任何关联。标准的 GData 库没有适用于项目托管服务的 .NET API,这就是本项目诞生的原因。

Using the Code

该库使用 C# 3.0 和 Microsoft .NET framework v2 构建。任何以 .NET framework v2 或更高版本为目标的 .NET 客户端应用程序都可以使用该库。该库还兼容 Mono v2.x。以 Mono v2.x 或更高版本为目标的应用程序可以毫无兼容性问题地使用该库。

要使用 IssueTracker 库,您必须拥有一个 Google 帐户。如果您还没有,可以在此 https://www.google.com/accounts/Login 创建一个。

要开始使用 IssueTracker 库,您需要创建对三个库文件的引用:

  1. GCore.dll
  2. GCodeIssueTracker.dll
  3. System.Serialization.Xml.dll

System.Serialization.Xml 是一个处理 Google 服务 ATOM 提要 XML 的序列化和反序列化的库。有关此库的更多详细信息,请参阅文档文件。GCore.dll 是一个核心库,负责处理对象与 XML 之间的底层转换,以及从 Google 提交和检索数据。它公开了一些用于处理 ATOM 提要和 Google 服务的基类。有关进一步的详细信息,请参阅帮助文件。GCodeIssueTracker.dll 是处理 Google Code 问题跟踪器服务的主要库。它也使用 GCore.dll 来提交和检索问题和评论。有关进一步的详细信息,请参阅项目的帮助文件。

要使用该库,请添加以下 using 声明块:

using System.Net;
using GCore;
using GCodeIssueTracker;
using GCodeIssueTracker.Query;

使用 ClientLogin 凭证进行身份验证

GCore 库使用 ClientLogin 机制进行 Google Code 服务的身份验证。使用提供的用户名和密码初始化 ProjectHostingService,后续调用将自动进行身份验证。

使用以下代码片段进行身份验证:

var service = new ProjectHostingService("project-name")
{
    GUserName = "username@gmail.com",
    GPassword = "gmailpassword",
    ProxySettings = new WebProxy("proxy-host-address", port)
            {
                Credentials = new NetworkCredential
                        {
                            UserName = "proxy-username",
                            Password = "proxy-password"
                        }
            }
};

有关 ProjectHostingService 类的更多详细信息,请参阅分发包中的帮助文件。

检索所有问题

要以提要的形式获取所有问题,请使用以下代码片段:

IssuesFeed resultFeed = service.GetAllIssues();
foreach (IssuesEntry item in resultFeed.Entries)
{
    Console.WriteLine(item.Id + " " + item.Title);
}

IssuesFeed 是一个类,它将所有问题作为 IssuesEntry 对象集合和其他一些字段来保存。这些类直接映射到从服务获得的 XML ATOM 提要。System.Serialization.Xml 将这些类序列化为 Google 服务接受的 ATOM 提要,并将 ATOM 提要反序列化为这些对象。

ProjectHostingService 类的 GetAllIssues() 方法按如下方式调用底层服务函数:

public IssuesFeed GetAllIssues()
{
    GUrl = "http://code.google.com/feeds/issues/p/" + 
           ProjectName + "/issues/full";
    return base.GetAllFeed<IssuesFeed, IssuesEntry>();
} 

GUrlGService 类的属性,它保存服务的提要 URL。GService 类大量使用泛型,但普通用户不必担心,因为这些复杂性完全隐藏在更高级别的服务类中。

使用查询参数检索问题

Google Code 问题跟踪器还为您提供了检索满足特定参数(如 ID、发布日期、所有者、作者等)的问题的功能。要查询服务,您必须先创建一个 IssueQuery 对象,然后将查询参数及其值附加到其中,最后调用服务函数 Query 来获取结果。以下是示例:

var query = new IssueQuery();
query.AppendQuery(QueryParamType.CanAll, "");
query.AppendQuery(QueryParamType.Author, "someauther");
query.AppendQuery(QueryParamType.Id, "104");
query.AppendQuery(QueryParamType.Label, "High");
query.AppendQuery(QueryParamType.MaxResults, "1000");
query.AppendQuery(QueryParamType.Owner, "username");
query.AppendQuery(QueryParamType.PublishedDateMax, 
                  Utility.ToFriendlyDateString(DateTime.Today));
query.AppendQuery(QueryParamType.PublishedDateMin, 
                  Utility.ToFriendlyDateString(DateTime.Today));
query.AppendQuery(QueryParamType.QueryString, "blogger");
query.AppendQuery(QueryParamType.Stars, "4");
query.AppendQuery(QueryParamType.Status, "Fixed");
query.AppendQuery(QueryParamType.UpdatedDateMax, 
                  Utility.ToFriendlyDateString(DateTime.Today));
query.AppendQuery(QueryParamType.UpdatedDateMin, 
                  Utility.ToFriendlyDateString(DateTime.MinValue));
Console.WriteLine(query.GetQueryUrl());
IssuesFeed resultFeed = service.Query(query);
foreach (IssuesEntry item in resultFeed.Entries)
{
    Console.WriteLine(item.Id);
}
Console.WriteLine("Total feed : " + resultFeed.Entries.Count); 

某些参数与其他参数是互斥的,例如 ID 不能与 max-result 一起出现在查询中。在这种情况下,将只考虑第一个附加的参数,而忽略其他参数。

检索问题的评论

要获取与特定问题相关的所有评论,您必须将问题 ID 传递给服务方法,如下所示:

IssueCommentsFeed resultFeed = service.GetAllIssueComments("104");

创建问题

这是本文档中最有价值的部分。使用此库,您可以直接从客户端应用程序将问题发布到 Google Code 项目。如果提交成功,服务方法将返回一个新的 IssueEntry 对象,其中包含其他信息,如问题 ID、发布日期等。下面是一个小示例:

var newEntry = new IssuesEntry
{
    Author = new Author { Name = "username" },
    Content = new Content { Type = "text", 
              Description = "Some Issue Descriptions" },
    Owner = new Owner { UserName = "username" },
    Status = "New",
    Title = "Test One",
    Labels = new List<string> { "Priority-Medium" },
    Ccs = new List<Cc> { new Cc { UserName = "username" } }
};
int id = service.SubmitNewIssue(newEntry, "app-name").Id;
Console.WriteLine(id);

创建问题评论

创建评论与创建 IssueEntry 非常相似。方法如下:

IssueCommentsEntry entry = new IssueCommentsEntry();
entry.Author = new GCore.Author { Name = "TestCommentName" };
entry.Content = new GCore.Content { Description = "Test Comment" };
entry.Updates = new Updates 
{ 
    CcUpdates = new List<string> { "username" }, 
    Labels = new List<string> { "Test Comment Update" }, 
    Status = "New", Summary = "Test Summery", 
    UpdateOwner = "username" 
};
IssueCommentsEntry newEntry = 
  service.SubmitNewIssueComment(entry, "7", "TestApp");
Console.WriteLine("New Comment's Id : " + newEntry .Id);

删除

由于 Google Code 问题跟踪器服务没有删除 API,因此必须使用 Web 界面来执行此操作。

关注点

整个代码库(除 Google 帐户授权外)都是从头开始编写的,采用了与官方 Google Data 库不同的方法。这种方法非常简洁且高度可扩展。GCore 库的编写方式使得任何依赖 ATOM 提要的 Google 服务都可以使用它来编写。这种可扩展性的主要公式是泛型。基服务类(即 GService)的所有方法都是泛型的。您可以创建自己的自定义子 ATOM 提要/条目类,并在自己的子 Google 服务类中使用它。

System.Serialization.Xml 库也非常有用。它可以将任何类序列化为 XML,也可以从中反序列化。该库负责将 ATOM XML 转换为提要类。这是一个通用库,不局限于此项目。在底层,它也使用泛型进行序列化。也许我会写另一篇文章介绍这个小而有用的库。

历史

  • 2010 年 1 月 9 日:初始发布。
© . All rights reserved.