Silverlight 2 (beta1)数据操作(7)——调用FlickR REST APIs来查询图片

在这个例子中我将展示从Silverlight客户端调用FlickR REST APIs。最后实现如下图所示:

目录

  • 确定Silverlight用户界面
  • 本地打开文件对话框
  • 调用FlickR服务来查找图片
  • 使用IsolatedStorag来维持跳转设置
  • 定义皮肤
  • 下载完整例子demo文件

第一部分:确定Silverlight用户界面

你可以回顾我的End
to End Silverlight Application
这篇帖子了解如何开始。首先在Blend中添加一个TextBox和Button控件,如下图所示:

务必在属性窗口为这些控件设置有意义的名称以便以后可以方便使用,我把这两个控件分别命名为searchTermTextBox和button。

拖一个示例图片到窗口中,接下来我们需要用到这个图片(你可以在SilverlightFlickRDemoFiles zip中使用cow.jpg这个图片)

还有一点务必设置它的名称,我命名为searchResultsImage

第二部分:本地打开文件对话框

为了测试布局,我们添加一个打开文件对话框来处理客户端的图片。

在page.xaml中为Button按钮添加一个单击事件

<Button x:Name="button" Width="100" Height="50"
        Content="Go"
        Click="button_Click"

在page.xaml.cs中编写按钮事件来调用打开文件对话框。

    private void button_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg |
                       All Files (*.*)|*.*";
        ofd.FilterIndex = 1;

        if (ofd.ShowDialog() == DialogResult.OK) {
            Stream stream = ofd.SelectedFile.OpenRead();
            BitmapImage bi = new BitmapImage();
            bi.SetSource(stream);
            searchResultsImage.Source = bi;
            stream.Close();
        }
    }

这段代码作用是打开系统本地文件对话框允许用者在本地磁盘选择文件。然后开发者只保存文件路径。注意我们怎样在客户端处理图片呢?

使用打开文件对话框,你可以上传文件到服务器或者存储文件到本地。但是这里我们是从flickr上查询图片。

第三部分:调用FlickR服务来查找图片

现在我们进入程序的主要部分了,我们根据查询条件通过调用FlickRs REST API来获取图片结果集。并且当用户在图片上单击,可以自动跳至下一张图片。

首先,调用FlickRs REST API,你需要申请一个Key,从这里可以获取。

接下来,定义一个LoadPhotos()方法在Silverlight客户端调用REST API。

void LoadPhotos(string topic)
{
    string apiKey = "<<get your own >>";
    string secret = "<<get your own >>";
    string url = String.Format("http://api.flickr.com/services
       /rest/?method=flickr.photos.search&api_key={1}&text={0}",
       topic, apiKey, secret);
    WebClient flickRService = new WebClient();
    flickRService.DownloadStringCompleted +=
        new DownloadStringCompletedEventHandler
        (flickRService_DownloadStringCompleted);
    flickRService.DownloadStringAsync(new Uri(url));
    searchTermTextBox.Text = "Calling FlickR...";
}

调用REST API完成之后,我们需要分析XML格式,你可以参考 http://flickr.com/services/api/explore/这个页面,其格式基本上像下面样子:

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
  <photos page="1" pages="32769" perpage="100" total="3276843">
    <photo id="2436622217" owner="[email protected]" secret="6c8293bb5c"
         server="2070" farm="3" title="IMG_3492_resize" ispublic="1"
         isfriend="0" isfamily="0" />
    <photo id="2437437876" owner="[email protected]" secret="97a7e1a066"
         server="2303" farm="3" title="Eric & Dog" ispublic="1"
         isfriend="0" isfamily="0" />
  </photos>
</rsp>

所以,我们需要用到XML,Silverlight 2对LinqToXml很好的支持,我们很容易利用LinqToXml来获取节点,使用LinqToXml之前,你需要在Silverlight工程中添加System.Xml.linq.dll程序集。

现在,让我们实现flickRService_DownloadStringCompleted方法。首先判断是否在调用过程中发生了错误,确定一下是否正确的调用了FlickR服务。

XDocument xmlPhotos = XDocument.Parse(e.Result);
if (e.Error != null ||
    xmlPhotos.Element("rsp").Attribute("stat").Value == "fail"){
    string results = e.Result;
    searchTermTextBox.Text= "Error! (" + results + ")";
    return;
}
else {
    searchTermTextBox.Text = "It worked!";
}

现在在单击事件中使用LoadPhotos方法。

private void button_Click(object sender, RoutedEventArgs e)
{
    LoadPhotos(searchTermTextBox.Text);
}

运行程序,如果你看到如下图所示的话,key验证失败,请检验你的API key

当你看到的是这样,你上面做的全部都正确了,可以接着往下做!

我们分析一下XML结果集,需要截取图片的URL地址,我们使用LINQ,首先呢,定义一个FlickRPhoto类来封装一下XML节点的映射。

public class FlickRPhoto
{
    public string Id { get; set; }
    public string Owner { get; set; }
    public string Secret { get; set; }
    public string Server { get; set; }
    public string Farm { get; set; }
    public string Title { get; set; }
}

还要添加一个属性值在遵循FlickR URL协议下格式化输出图片URL。

public string ImageUrl
{
    get
    {
        return string.Format("http://farm{0}.static.flickr.com
            /{1}/{2}_{3}.jpg", Farm,Server,Id,Secret);
    }
}

现在,我们需要使用LINQ编码实现类成员与XML节点的映射。

Photos = from photo in xmlPhotos.Element("rsp").Element("photos")
                                .Descendants().ToList()
         select new FlickRPhoto
         {
             Id = (string)photo.Attribute("id"),
             Owner = (string)photo.Attribute("owner"),
             Secret = (string)photo.Attribute("secret"),
             Server = (string)photo.Attribute("server"),
             Farm = (string)photo.Attribute("farm"),
             Title = (string)photo.Attribute("title"),
         };

在这个类中定义一个Photos字段,将来会用到。

IEnumerable<FlickRPhoto> Photos;

接下来显示图片,获取返回的结果集第一个记录并且显示。

FlickRPhoto p = Photos.First();
this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);
searchTermTextBox.Text = p.Title;

现在非常酷了,但是我想要显示别的图片,当单击图片的时候显示另一张图片。这样做的话先定义一个事件驱动。

<Image MouseLeftButtonDown="searchResultsImage_MouseLeftButtonDown"
             x:Name="searchResultsImage" 

接下来实现这个事件,先预先检验图片是否为空,在使用当前ImageNumber字段数值获取下一张图片。

private void searchResultsImage_MouseLeftButtonDown
(object sender, MouseButtonEventArgs e)
{
    if (Photos == null) return;
    if (ImageNumber >= Photos.Count()) ImageNumber = 0;

    FlickRPhoto p = Photos.Skip(ImageNumber).First();
    this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);

    ImageNumber++;
}

现在你在图片上点击,它循环的显示图片了。

第四部分:使用IsolatedStorag来维持跳转设置

现在,我们考虑一下跳转时候的一些状态。

首先,当“Go”按钮按下的时候,保存textbox所有的信息。

private void button_Click(object sender, RoutedEventArgs e)
{
    LoadPhotos(searchTermTextBox.Text);
    ApplicationSettings.Default["searchTerm"] = txtBox.Text;
    ApplicationSettings.Default.Save();

}

当改变图片的时候,同样也这样处理。

private void searchResultsImage_MouseLeftButtonDown
    (object sender, MouseButtonEventArgs e)
{
    if (Photos == null) return;
    if (ImageNumber >= Photos.Count()) ImageNumber = 0;

    FlickRPhoto p = Photos.Skip(ImageNumber).First();
    this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);
    searchTermTextBox.Text = p.Title;

    ApplicationSettings.Default["imageNumber"] = ImageNumber;
    ApplicationSettings.Default.Save();

    ImageNumber++;

}

其次,当程序开始运行的时候,我们获取最近的设置并且用它初始化这个程序

public Page() {
    InitializeComponent();
    if (ApplicationSettings.Default.Contains("searchTerm")){
        this.txtBox.Text =
            (string)ApplicationSettings.Default["searchTerm"];
        button_Click(null, null);
    }
    if (ApplicationSettings.Default.Contains("imageNumber")){
        ImageNumber = (int)ApplicationSettings.Default["imageNumber"];
    }
}

当你第一次运行时,它不需要保存状态,使用默认设置。但是,再一次运行的时候,它获取你之前设置的状态。

第五部分:定义皮肤

现在,我们为它设置一款漂亮的皮肤,我使用的是Corrina‘s Rough皮肤样式。

这步很简单,仅仅需要从Corrina的样例App.Xaml中的 <ApplicationResources>节点部分复制粘贴到你的App.Xaml文件中去。然后在页面中添加如下的样式:

<Button Style="{StaticResource buttonStyle}"
<TextBox Style="{StaticResource textBoxStyle}" 

OK,完成了这个程序了:

版权声明:本文为博主http://www.zuiniusn.com 原创文章,未经博主允许不得转载。

时间: 2024-11-07 17:20:01

Silverlight 2 (beta1)数据操作(7)——调用FlickR REST APIs来查询图片的相关文章

Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)

导言 Silverlight 2支持JSON.Web Service.WCF以及Sockets等新特性对数据CRUD操作,这个系列用实例结合数据库一步一步的图文描述来学习一下Silverlight 2 beta 1中进行数据库的CRUD操作方面的实战能力. 这篇文章介绍如何在Silverlight 2 beta 1中使用LINQ to SQL进行数据CRUD操作.我把这个实例大致分为3层. 这里多说几句:微软发布的是Silverlight 2 beta1 并不是Silverlight 2.0,也

Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)

Silverlight客户端实现 这个部分主要完成Silverlight客户端的操作,首先引用WCF服务,然后在Page页面中,我们使用DataGrid控件来实现对数据的绑定,另外,添加一个用户控件实现增加.删除.修改操作处理.下面一步一步来实现这些步骤吧. 第一步:引用WCF服务 第二步:添加一个用户控件 第三步:编辑用户控件界面 为了演示方面,我没有做任何的界面美化,仅仅把数据库相应的字段在TextBox上实现双向绑定,即在任何时候都可以同时更新源数据和目标.提供了保存,删除,添加按钮实现数

Silverlight 2 (beta1)数据操作(3)——使用ADO.NET Data Service (Astoria)进行数据CRUD操作

目录 导言 软件需求 在SQL 2005中创建数据库 在Visual Studio 2008中创建Silverlight工程和ADO.NET Data Service 创建一个XMLHttpRequestWrapper类 在Silverlight中使用Astoria进行CRUD操作 导言 Silverlight 2支持JSON.Web Service.WCF以及Sockets等新特性对数据CRUD操作,这个系列用实例结合数据库一步一步的图文描述来学习一下Silverlight 2 beta 1中

Silverlight 2 (beta1)数据操作(1)——使用ASP.NET Web Service进行数据CRUD操作(上)

目录 导言 软件需求 在SQL 2005中创建数据库 在Visual Studio 2008中创建 Silverlight 2 (beta1)工程 在ASP.NET工程里创建Web Service 在Silverlight 2 (beta1)工程中引用ASP.NET Web Service 添加数据部分 查询数据部分 修改数据部分 删除数据部分 整合程序 结语 例子下载 导言 Silverlight 2支持JSON.Web Service.WCF以及Sockets等新特性对数据CRUD操作,这个

Silverlight 2 (beta1)数据操作(2)——使用ASP.NET Web Service进行数据CRUD操作(下)

前台界面 后台代码 //按钮事件 void saveButton_Click(object sender, RoutedEventArgs e) { if (userName.Text.Trim() == string.Empty) { errMessage.Foreground = new SolidColorBrush(Colors.Red); errMessage.Text = "请输入用户名称!"; errMessage.Visibility = Visibility.Visi

SQL应用与开发:(七)数据操作 &#183; 查 &#183; (三)使用子查询访问和修改数据

3.使用子查询访问和修改数据 子查询和连接查询一样提供了使用单个查询访问多个表中的数据的方法.子查询在其他结果的基础上提供一种有效地方式来表示WHERE子句的条件.子查询是一个SELECT语句,它定义在SELECT.INSERT.UPDATE或DELECT语句或者另一个子查询中.子查询的SELECT语句可与外部查询指向不同的表. 嵌套的子查询或嵌套的SELECT语句是指包含一个或多个子查询的SELECT语句.子查询可嵌套在外部的SELECT.INSERT.UPDATE或DELECT语句的WHER

Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程

前言:      SQLite是遵守ACID 的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.       不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接API调用.这在消耗总量.延迟时间和整体简单性上有积极的作用.整个数据库(定义.表.索引和数据本身)都在宿主主机上存储在一个单一的文件中.它的简单的设计是通过在开始一个事务的时候锁定整个数

使用Python调用Flickr API抓取图片数据

Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据. 首先需要先去Flickr注册成为其开发者,创建应用,获得API_KEY和API_SECRET,其API网址在:https://www.flickr.com/services/api/ Flickr提供了多种开发工具进行使用.这里我们使用Python开发工具.官方推荐的开发工具是Beej’s Python

JAVA调用mysql数据操作时出现错误:impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.&#39;

使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM ActiveMQ中如果使用mysql innodb的同时,开启了binlog,那么在ack消息的时候,日志里就可会报错:java.sql.SQLException: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATE