[開發] 在WP8上讀取XML/JSON的方法(2)

看板WindowsPhone作者 (WildDagger)時間10年前 (2014/02/06 22:37), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
承接上篇的(1),這篇(2)開始是實作,所以有SDK的可以開始跟著操作了 當然很重要的是Win8系一直是接著所謂WPF那套MVVM(Model-ViewModel-View)模式, (MVVM應該是從WPF開始提的吧?) 所以在這之前最好先用個類別檔把你的Model給建出來 一個Model可能會是這樣的構成: (外面包的namespace我這邊略掉,只提出Model的部分) public class Model { public string PropertyA {get; set;} public int PropertyB {get; set;} private bool _propertyC; public bool PropertyC { get { return this._propertyC; } set { this._propertyC = value; } } } 總之雖然C#有規則可以用get和set來修飾, 不過這些Model用的欄位可別忘記要初始化(特別是List之類的複雜結構) 不然執行時也會跳錯的 (雖然我到現在也還是會常常犯這種低級錯誤就是了......(死)) 為了維護方便,Model類別最好單獨放一個類別檔, 而讀取並且生成資料集的類別也請另外再做一個類別檔, 才不會搞到自己昏頭轉向。 (我自己的習性是將資料集取成DataSource.cs) Windows 8/8.1上面可以直接用System.Net.Http命名空間 其中的HttpClient與HttpResponseMessage搭配Async/Await來達成非同步, 但是Windows Phone 8上面沒有這個物件, WebClient功能也不怎麼好,API也完全不一樣, 移植起來非常的讓人苦惱...... 這個時候,就輪到NuGet的登場啦! 在方案總管視窗的「參考」上面按右鍵,選擇「管理NuGet套件」 接下來只要在右上方的搜尋輸入「http」 很快的NuGet套件管理員就會自動找出我們需要的這個套件: (有的時候可能會被套件海淹沒,總之試著多翻幾頁找找看, 不過沒意外的話應該都在第一頁才對) 「Microsoft HTTP Client Libraries」 沒錯,這個套件就是我們需要的讀取網路資料套件了 (說明上有說可以用在Windows Phone 7.5,當然我沒用過,想嘗試的可以試試看) 直接選擇安裝,Visual Studio就會把這個套件安裝到專案裡面, 另外這個套件同時也會需要另外兩個套件,請一併安裝。 安裝完後,直接在程式碼裡面使用System.Net.Http, 還有其所包含的HttpClient與HttpResponseMessage也不會再發生找不到的錯誤了 重點是,這幾個模組的使用方法與Windows 8/8.1包含的同名模組一模一樣 因此寫完以後一行程式碼都不用改就能直接移植到Win8/8.1上了,斯巴拉希!(日文) 那麼接下來開始使用這個模組吧! 首先必須知道的是,因為這個模組使用的是Async/Await的非同步模式 但是建構式是不能加上Async的(連帶的Await也不能用) 所以我們必須使用看來有點拐彎抹角的方式: (這邊一樣省去class與相關屬性的宣告,請注意) public DataSource() { GetData(); } public async void GetData() { (取得資料的程式碼) } 用這樣呼叫函式的方式,就能在建構式中以HttpClient取得網路資料了 (這邊要特別注意千萬別把GetData的回傳類型寫成Task或Task<string>之類的類型了, 這樣只會讓程式變得更複雜而已) 首先是要宣告HttpClient變數,並且讀入url,就可以用HttpClient來聯繫資料 由於HttpClient可以一對多網站連接, 所以不需要每連一個網站就宣告一個HttpClient變數,那樣反而會產生大量系統資源浪費 如果有需要連接多個不同網站來源(比方說各大新聞網站等)請善加利用這點 宣告的方式意外的很簡單: HttpClient httpClient = new HttpClient(); 這樣就完成宣告了,不用什麼參數。 接下來是HttpResponseMessage的宣告,和代表連接用客戶端的HttpClient不同, 每連接一個網站就要新宣告一個HttpResponseMessage, 因為HttpResponseMessage是代表一個網站經過連接後傳回來的訊息, 所以有多個網站就一定會有多個完全不同的訊息。 宣告的方法一樣很簡單: HttpResponseMessage httpResponseMessage = await httpClient.GetAsync(url); 這個宣告一定要用HttpClient有的GetAsync函式來宣告, 執行到這裡的時候就會根據你給予的url字串中寫的網址去抓該網址的資料 (用的方式是GET方法,POST是別的函式這邊不討論) 抓到之後,就可以使用HttpResponseMessage內建的HttpContent物件, 把抓到的內文給抓出來讀取 到目前為止都是一行就OK,讀取一樣也是一行OK: string content = await httpResponseMessage.Content.ReadAsStringAsync(); 這樣透過網路抓回來的資料就會變成字串, 接下來就可以送給XML/JSON的解析器讓他們來分析這批資料了。 當然,也可以透過IsolateStorage、Windows.Storage等相關API來儲存離線檔案 (但要特別注意的是,因為抓取可能會有連線中斷等各種造成例外的不確定因素, 請務必搭配try-catch區塊防止因例外而導致出錯閃退的問題) 雖說Windows Phone本身是有一些網路功能相關的函式也能達成同樣的功能 不過因為我是從Windows 8那邊轉過來,基於移植方便度的前提下找到這個組件庫 在取得資料的方式可以直接移植的情況下,移植的困難度應該也會大幅度減少。 (剩下的介面問題那又是另外一回事了) 下一篇的(3)就是JSON與XML的解析重頭戲了(望 --

11/18 23:41,
在我房間
11/18 23:41

11/18 23:43,
有兇真
11/18 23:43

11/18 23:44,
在裸睡
11/18 23:44

11/18 23:44,
和軟軟的香蕉一起
11/18 23:44

11/18 23:45,
フゥーッハハハハ!
11/18 23:45

11/18 23:47,
簽名檔gate
11/18 23:47
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.250.44.64 ※ 編輯: hoyunxian 來自: 111.250.44.64 (02/06 22:39)
文章代碼(AID): #1IyvujhD (WindowsPhone)