現在是網絡的時代,也是移動的時代,網絡和移動的結合更是趨勢。由此誕生了不少的移動網絡應用,從以前較爲簡單的WAP手機應用發展到如今的各類富互聯網應用,更多許多優秀的移動應用客戶端,諸如微博、QQ等客戶端更是移動用戶的必裝軟件,他們的共同點就是與網絡打交道。在Windows Phone 開發中,有以下幾種經常使用的方式進行網絡交互。【下述代碼點擊這裏下載】php
通常的代碼格式以下:算法
申明一個WebClient實例,註冊該實例的DownloadStringCompleted事件,而後發起異步請求便可。下面以博客園的訂閱博客爲例講解如何在Windows Phone 中使用WebClient。 api
下圖是運行後的效果圖,咱們輸入博主的名稱,如alexis,點擊"Get Blogs",查出的結果就是該博主近期的博客的訂閱 瀏覽器
點擊按鈕的處理代碼以下 安全
其中第一行代碼是用於在SystemTray上顯示當前信息,這在之前的博客中已說起。下面來看看註冊的client_DownloadStringCompleted事件 服務器
在講解上述代碼以前,咱們先來看看咱們下載的數據源是什麼樣的,使用谷歌瀏覽器打開http://www.cnblogs.com/alexis/rss 就能看到數據源是基於XML格式的,由一個個item組成 網絡
這裏是使用XML TO LINQ實現的,首先將下載下來得字符串轉換爲XML中的XElment,而後使用Linq將咱們所須要的值的集合找出來,最後將集合做爲ListBox的數據源以進行顯示,RssItem的定義以下: app
上一節中講解了WebClient的簡單用法,WebClient是請求遠程資源的最簡單的方法,它其實是對HttpWebRequest的進一步封裝,隱藏了請求中的一些細節,而HttpWebRequest則可讓你瞭解請求的過程。 異步
使用HttpWebRequest進行HTTP請求的步驟以下:
1. 建立HttpWebRequest的一個實例
2. 對請求流寫入一些東西(如文件)若是你須要的話
3. 得到響應
4. 讀取返回流中的數據
5. 關閉流 ide
那麼上述得到博客的例子能夠利用HttpWebRequest重寫以下:
對於REST服務請求的封裝,第三方類庫中Hammock以及RESTSharp都作得很好,我這裏採用的是Hammock。咱們這裏只講解Hammock的簡單用法:
更多的能夠參考源代碼
咱們查看微盤的API文檔,發現提供了許多類型的請求,分別對應不一樣類型的操做。爲了開發時和後期維護方便,我定義了一個枚舉類型的服務類型,便於標識區分這些服務:
如上所述,使用REST服務的步驟就是發起一個請求,設置一些請求參數,而後坐等異步的回調,在回調中得到服務器返回的數據,從而進行處理。
獲取token與其餘全部的請求不同,他是全部其餘請求的先決條件,咱們只有獲取到Token後才能發起其餘請求:
這裏咱們須要傳入咱們應用的AppKey還有當前的時間戳,如下方法是在Windows Phone 中獲取當前時間戳的方法:
另外,你們是否注意到,咱們這裏須要傳入一個簽名signature,你們應該都知道通常都是用簽名來提升數據傳輸的安全性。由於token是十分 機密的數據,若是讓別人截獲了token,他就能夠對你的微盤進行任何操做。咱們來看看API文檔中是如何定義須要傳入的signature的:
signature: 動態簽名, hmac_sha256("account=相應的值&appkey=相應的值&password=相應的值&time=相應的值", app_secret)
對應的PHP實例: $signature = hash_hmac('sha256', "account={$account}&appkey={$appkey}&password={$password}&time={$time}", $app_secret, false);
有一個相應的算法,由於API網站中給出的是php的調用方法,hash_hmac是php中的一個函數,那麼C#中有沒有與之對應的函數呢?下面是獲取簽名的方法。
須要注意的是:
有了請求,咱們只須要BeginRequest就能夠得到相應的Response:
其中:
restClient是RestClient類的實例
Constants.ApiUrl爲微盤的API地址
AsyncCallback爲異步回調接收響應的函數,注意到咱們這裏傳入了一個服務類型爲ServiceType.GetToken,這樣作的好處是咱們可使用一個單獨的回調函數進行處理,而不要每個請求對應一個回調函數。
上圖是AsyncCallback的簽名。下面來看看如何處理得到token
使用switch對請求類型以進行區分對待。咱們使用Newtonsoft.Json中提供的JsonConvert對返回的數據進行序列化
其中,TokenResponse的定義以下
咱們須要將得到的token和dologid保存,用於下次請求。 有了Token之後,咱們才能夠進行下面的請求。
Note:空閒時(不作任何操做, 15分鐘後)token會失效
微盤API中通常的請求都是路徑和參數不同的,爲了方便管理,我這裏新建了一個獲取特定請求的幫助類,以下圖是獲取上傳文件的請求:
其中UploadFileReq是封裝的請求類,裏面是一些傳入請求中的參數,其定義以下圖:
同獲取Token的方法同樣,咱們只須要BeginRequest一下便可
注意要加上相應的服務類型ServiceType.UploadFile
其餘的請求服務封裝同上傳文件,這裏就很少說了,詳細的能夠查看源代碼。
封裝接口後,咱們須要對外面提供相應的接口,以方便Windows Phone 應用程序調用封裝的類庫。
微盤全部的接口都是基於登陸後得到的Token才能請求成功的,因此首先咱們須要提供的就是登陸的接口。查看API文檔知道,調用登陸接口(即獲取 Token)須要的參數值有以下幾個:帳號、密碼、AppKey以及AppSecret。做爲一個通用的SDK類庫,咱們須要提供接口讓調用者設置一些相 應的初始值,如AppKey、AppSecret。
我是提供了一個public的屬性給外界,以下圖
你們是否注意到,對應請求的回調函數,我是統一用一個函數進行處理,以ServiceType進行區分判斷,那麼怎麼將這個回調函數公佈呢?這裏我使用的一個委託,並定義一個該類型的公共屬性,把這個公共屬性做爲對外的接口:
在回調中函數調用該屬性
這樣咱們在Windows Phone程序中註冊該委託就能夠獲得回調函數中的數據了。
咱們封裝好REST服務後,就能夠在咱們的Windows Phone應用程序中使用了。具體的方法以下:
由於基本上全部的API都是須要Token的,因此獲取Token確定是第一步,即調用SDK的獲取Token方法:
其中,
Constants.AppKey即咱們在微盤網站上申請的應用的AppKey
Constants.AppSecret即對應的AppSecret
而後就是調用服務的獲取Token方法,須要傳入用戶名與密碼。
你們是否注意到,咱們給NetService實例的ServicecallBack屬性賦值爲登陸回調函數:
因爲登陸有可能失敗,因此咱們也須要處理失敗的狀況。Note:若是是跨線程調用,則咱們須要將改變UI線程的代碼放在Deployment.Current.Dispatcher.BeginInvoke中。
下面來說如何上傳文件到微盤的接口,做爲示例,咱們將輸入文本框的文字保存爲文本文件上傳到微盤中,頁面的大體效果圖以下
由於只有登陸後才能上傳文件,因此先講Upload按鈕設爲不可用。
登陸代碼上面已經給出,咱們在點擊Upload按鈕的時候須要作以下兩件事情:
下述代碼是建立一個文本,其中fileName爲字符串常量
而後來看下按鈕事件:
首先進行輸入框中是否有輸入,若是沒有彈出提示框。而後在獨立存儲空間生成文本文件,最後就是調用微盤SDK的上傳方法,輸入相應的參數,指定回調函數
點擊Upload,等了一會若是彈出提示"upload file succeed"的話,那麼恭喜你,文件上傳成功後,咱們能夠登陸微盤check一下:
能夠檢查一下上傳時間是否是如今的時間,固然你也能夠重命名文件名。
微盤中可能有個別接口沒有實現,若是有興趣貢獻代碼的能夠跟我聯繫 。
微盤SDK for Windows Phone的源代碼能夠在vdisk.codeplex.com 上找到,謝謝你的支持