在本文中,将探讨如何编写一个应用程序来使用Digg搜索服务。将从定义一个模型类开始,然后展示如何使用这个类来执行搜索。文章最后,将看到一个包含所有代码的示例应用程序。
首先,需要定义一个模型类来存储单个Digg条目的信息。这个类将包含以下属性:
以下是C#语言中定义这个模型类的代码示例:
public class DiggStory
{
public DiggStory(string title, string description, string link, int diggs)
{
Title = title;
Description = description;
Link = link;
Diggs = diggs;
}
public string Title { get; set; }
public string Description { get; set; }
public string Link { get; set; }
public int Diggs { get; set; }
}
这个类通过构造函数初始化实例,并提供了属性的get和set方法。
在实现过程中,将使用Digg搜索API,它返回基于XML的结果。因此,将使用LINQto XML来方便地解析输出。为此,需要添加对System.Xml.Linq.dll程序集的引用。
大多数服务提供商,包括Digg,都要求为应用程序生成一个应用密钥。这有助于他们了解谁在使用他们的服务,并允许他们限制单个消费者的请求。
以下是生成应用密钥的代码示例:
private const string DiggApplicationKey = "http://www.myapp.com";
请注意,这个密钥仅供示例使用,建议在商业应用程序中生成一个新的密钥。
查询Digg服务相对简单。只需使用以下链接:
http://services.digg.com/search/stories?query={0}&appkey={1}
其中{0}应该替换为搜索词,{1}应该替换为应用密钥。
Search方法将接收搜索词作为参数。此外,由于希望类异步工作,还将接受几个委托作为参数:
以下是Search方法的签名:
public static void Search(string searchText, Action> onSearchCompleted = null, Action onError = null, Action onFinally = null)
要运行搜索,将使用WebClient类:
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += delegate(object sender, DownloadStringCompletedEventArgs e)
{
// 处理下载完成事件
};
webClient.DownloadStringAsync(new Uri(string.Format(DiggSearchQuery, searchText, DiggApplicationKey)));
其中DiggSearchQuery定义如下:
private const string DiggSearchQuery = "http://services.digg.com/search/stories?query={0}&appkey={1}";
搜索的结果是XML字符串,所以使用LINQto XML来解析它:
XElement storyXml = XElement.Parse(e.Result);
var stories = from story in storyXml.Descendants("story")
select new DiggStory(
story.Element("title").Value,
story.Element("description").Value,
story.Attribute("link").Value,
int.Parse(story.Attribute("diggs").Value));
其余的代码处理不同的委托:onCompleted、onError、onFinally。以下是该方法的完整代码:
public static void Search(string searchText, Action> onSearchCompleted = null, Action onError = null, Action onFinally = null)
{
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += delegate(object sender, DownloadStringCompletedEventArgs e)
{
try
{
if (e.Error != null)
{
if (onError != null)
{
onError(searchText, e.Error);
}
return;
}
XElement storyXml = XElement.Parse(e.Result);
var stories = from story in storyXml.Descendants("story")
select new DiggStory(
story.Element("title").Value,
story.Element("description").Value,
story.Attribute("link").Value,
int.Parse(story.Attribute("diggs").Value));
if (onSearchCompleted != null)
{
onSearchCompleted(stories);
}
}
finally
{
if (onFinally != null)
{
onFinally();
}
}
};
webClient.DownloadStringAsync(new Uri(string.Format(DiggSearchQuery, searchText, DiggApplicationKey)));
}
使用这个类非常简单,只需传递所需的搜索词和一个用于“完成”通知的委托。
DiggService.Search(textbox.Text, (items) => { listbox.ItemsSource = items; }, (s, exception) => { MessageBox.Show("Search term " + s + " could not be found due to:\n" + exception.Message); }, null);