Windows Phone 7 開發 31 日談——第25日:外部API

l_serein發表於2012-11-08

本文是 Windows Phone 7 開發 31 日談” 系列的第25日。

昨天我寫了如何在你的應用程式中嵌入字型,視訊和圖片。今天,我們來討論從Web Service中獲取資料,並將它們填入到你的應用程式中。

介紹Twitter API

    如果你之前沒有玩兒過這個,那你肯定會常聽我將一個Twitter應用程式比喻為“Hello, world!”程式。原因很簡單,因為幾乎每一個應用程式都需要連線Web Service,Twitter的API用起來非常簡單,並且是免費的,不需要任何註冊。換句話說,你可以無障礙地介入,這是學習新技術的一種好方法。

    有關Twitter API的關鍵內容可以在這裡找到:http://dev.twitter.com/ 。我們來看看使用者時間線元素的API,利用這個指定的URL模板:http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=jeffblankenburg 。這裡的使用者名稱,jeffblankenburg ,可以用任意的Twitter使用者名稱替換。

    如果點選我給你提供的URL,你會看到很多XML文件。這個文件包含了我最近的Twitter資訊,以及大量的後設資料。以下是這個文件中的一個節點:

[xhtml] view plaincopy
  1. <status>  
  2.   <created_at>Sun Oct 24 13:30:04 +0000 2010</created_at>  
  3.   <id>28594986565</id>  
  4.   <text>Day #24: Embedding Fonts in Windows Phone 7 http://bit.ly/wp7day24 #wp7 #wp7dev #31daysofwp7</text>  
  5.   <source>  
  6.     <a href="http://www.tweetdeck.com" mce_href="http://www.tweetdeck.com" rel="nofollow">TweetDeck</a>  
  7.   </source>  
  8.   <truncated>false</truncated>  
  9.   <favorited>false</favorited>  
  10.   <in_reply_to_status_id />  
  11.   <in_reply_to_user_id />  
  12.   <in_reply_to_screen_name />  
  13.   <retweet_count />  
  14.   <retweeted>false</retweeted>  
  15.   <user>  
  16.     <id>5688882</id>  
  17.     <name>Jeff Blankenburg</name>  
  18.     <screen_name>jeffblankenburg</screen_name>  
  19.     <location>Columbus, OH</location>  
  20.     <description>I'm a passionate technologist, husband, and father in Columbus, OH. I work for a small software company located in Redmond, WA. #wp7 http://blankensoft.com</description>  
  21.     <profile_image_url>http://a3.twimg.com/profile_images/396764567/jeffblankenburgheadshot_normal.jpg</profile_image_url>  
  22.     <url>http://www.jeffblankenburg.com</url>  
  23.     <protected>false</protected>  
  24.     <followers_count>1962</followers_count>  
  25.     <profile_background_color>131516</profile_background_color>  
  26.     <profile_text_color>333333</profile_text_color>  
  27.     <profile_link_color>994700</profile_link_color>  
  28.     <profile_sidebar_fill_color>cccccc</profile_sidebar_fill_color>  
  29.     <profile_sidebar_border_color>999999</profile_sidebar_border_color>  
  30.     <friends_count>652</friends_count>  
  31.     <created_at>Tue May 01 15:54:53 +0000 2007</created_at>  
  32.     <favourites_count>201</favourites_count>  
  33.     <utc_offset>-18000</utc_offset>  
  34.     <time_zone>Eastern Time (US & Canada)</time_zone>  
  35.     <profile_background_image_url>http://s.twimg.com/a/1287010001/images/themes/theme14/bg.gif</profile_background_image_url>  
  36.     <profile_background_tile>true</profile_background_tile>  
  37.     <profile_use_background_image>true</profile_use_background_image>  
  38.     <notifications>false</notifications>  
  39.     <geo_enabled>true</geo_enabled>  
  40.     <verified>false</verified>  
  41.     <following>true</following>  
  42.     <statuses_count>5664</statuses_count>  
  43.     <lang>en</lang>  
  44.     <contributors_enabled>false</contributors_enabled>  
  45.     <follow_request_sent>false</follow_request_sent>  
  46.     <listed_count>151</listed_count>  
  47.     <show_all_inline_media>false</show_all_inline_media>  
  48.   </user>  
  49.   <geo />  
  50.   <coordinates />  
  51.   <place />  
  52.   <contributors />  
  53. </status>  

對於上面的內容要記住的是這僅僅是XML,沒有什麼神祕的,也沒神祕特別的。網路中大多數Web Service都提供了XML源,一般來說,我們可以以一種統一的方式來處理它們。

將XML資料從網路中獲取到我們的應用程式

    從手機中正在執行的應用程式上線上獲取XML資料非常簡單(只需3行!)。最重要的是要由你來檢測使用者是否已經獲取到了連線。下面是一種非常簡單的方法,使用Microsoft.Phone.Net.NetworkInformation程式集:

[c-sharp] view plaincopy
  1. if (NetworkInterface.GetIsNetworkAvailable())  

在這個迴圈中,我們要建立一個WebClient物件,並非同步呼叫我剛剛給你的地址中的Twitter API。首先,我為資料檢索完成後建立了一個事件處理程式,然後發起非同步呼叫。(在這個例子中,你會看到我用了一個文字框中來獲取使用者輸入的使用者名稱)

[c-sharp] view plaincopy
  1. if (NetworkInterface.GetIsNetworkAvailable())  
  2. {  
  3.      WebClient twitter = new WebClient();  
  4.      twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);  
  5.      twitter.DownloadStringAsync(new Uri("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=" + TwitterNameBox.Text));  
  6. }  

當返回資料時,事件處理程式會被呼叫,此時我們需要新增一些內容。

在應用程式中使用XML

當我們程式中獲取到了資料時,就要真正地在螢幕上顯示它們了。在我的其他例子中,我展示瞭如何將一個值繫結到XAML控制元件上。但本文重點不在此(雖然下面的示例程式碼中包含這些內容),相反,我們來看看如何用LINQ來解析XML資料。

為此,需要引入另一個名稱空間,System.Xml.Linq。把它加入後,資料就變的非常簡單了。我們需要一個新的XElement物件來儲存XML資料。

[c-sharp] view plaincopy
  1. XElement xmlTweets = XElement.Parse(e.Result);  

一旦xmlTweets中儲存了我們的資料,剩下要做的就是將它繫結到一個ListBox中,並使用LINQ從這些資料中建立自定義的TwitterItem物件。

[c-sharp] view plaincopy
  1. TwitterList.ItemsSource = from tweet in xmlTweets.Descendants("status")  
  2. select new TwitterItem{message = tweet.Element("text").Value};  

你會看到在下面的示例程式碼中,我自定義的TwitterItem類中包含一個“message”屬性。

就是這樣!我們從XML源中實時抓取資料,然後再程式中處理它們,最後將它們顯示在ListBox中。至於完整的示例,參見下面的程式碼:

下載示例程式碼

這是一個完全可以執行的(但肯定不是包含所有功能的)Twitter客戶端。你可以在文字框中輸入一個使用者名稱,然後程式就會連線Twitter API,抓取資料,解析並在程式中顯示。

clip_image001

原文地址:http://www.jeffblankenburg.com/post/31-Days-of-Windows-Phone-7c-Day-25-Talking-To-External-APIs.aspx

相關文章