除了可使用HttpWebRequest類來實現HTTP網絡請求以外,咱們還可使用HttpClient類來實現。對於基本的請求操做,HttpClient類提供了一個簡單的接口來處理最多見的任務,併爲身份驗證提供了適用於大多數方案的合理的默認設置。對於較爲複雜的 HTTP 操做,更多的功能包括:執行常見操做(DELETE、GET、PUT 和 POST)的方法;獲取、設置和刪除 Cookie 的功能;支持常見的身份驗證設置和模式;異步方法上提供的 HTTP 請求進度信息;訪問有關傳輸的安全套接字層 (SSL) 詳細信息;在高級應用中包含自定義篩選器的功能等。html
(1)獲取字符串數據web
HttpClient類使用基於任務的異步模式提供了很是簡化的請求操做,你能夠直接調用HttpClient類GetStringAsync方法即可以獲取到網絡返回的字符串數據。下面咱們來看一下使用Get請求來獲取網絡返回的字符串,實現的代碼很簡潔和簡單,示例代碼以下所示:編程
Uri uri = new Uri("http://yourwebsite.com"); HttpClient httpClient = new HttpClient(); // 獲取網絡的返回的字符串數據 string result = await httpClient.GetStringAsync (uri);
使用GetStringAsync方法是一種簡化的HTTP請求,若是咱們要獲取到HTTP請求所返回的整個對象HttpResponseMessage類對象可使用GetAsync方法。HttpResponseMessage對象是HTTP的相應消息對象,它包含了網絡請求相應的HTTP頭、數據體等信息。下面咱們使用GetAsync方法來獲取網絡返回的字符串信息,示例代碼以下所示:安全
HttpResponseMessage response = await httpClient.GetAsync(uri); string responseBody = await response.Content.ReadAsStringAsync();
(2)獲取數據流數據服務器
HttpResponseMessage對象的Content屬性表示是返回的數據對象,是一個IHttpContent類型的對象。若是要獲取的是數據流數據,能夠經過它的ReadAsBufferAsync方法獲取到返回的IBuffer對象,或者經過ReadAsInputStreamAsync地方獲取IInputStream對象,而後再轉化爲Stream對象,示例代碼以下所示:微信
using (Stream responseStream = (await response.Content.ReadAsInputStreamAsync()).AsStreamForRead()) { int read = 0; byte[] responseBytes = new byte[1000]; do { // 若是read等於0表示Stream的數據以及讀取完畢 read = await responseStream.ReadAsync(responseBytes, 0, responseBytes.Length); } while (read != 0); }
(3)取消網絡請求cookie
HttpClient類發起的網絡請求都是基於任務的異步方法,因此要取消其異步的操做能夠經過異步任務的取消對象CancellationTokenSource對象來取消,這點和HttpWebRequest類是不一樣。若是使用CancellationTokenSource對象來取消異步的請求會觸發TaskCanceledException異常,這個異常須要咱們用try catch語句來捕獲,即可以識別到請求是被取消的。網絡
private CancellationTokenSource cts = new CancellationTokenSource(); try { // 使用CancellationTokenSource對象來控制異步任務的取消操做 HttpResponseMessage response = await httpClient.GetAsync(new Uri(resourceAddress)).AsTask(cts.Token); responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token); cts.Token.ThrowIfCancellationRequested(); } catch (TaskCanceledException) { responseBody = "請求被取消"; } // 調用Cancel方法取消網絡請求 if (cts.Token.CanBeCanceled) { cts.Cancel(); }
使用HttpClient類發起Post請求的編程方式也很簡潔,咱們能夠調用方法PostAsync(Uri uri, IHttpContent content)來直接向目標的地址Post數據,在該方法裏面有兩個參數其中uri就是網絡的目標地址,兩外一個content是指你要向目標地址Post的數據對象。在Post數據以前咱們首先把咱們的數據初始化成爲一個IHttpContent對象,那麼實現了IHttpContent接口的類有HttpStringContent類、HttpStreamContent類和HttpBufferContent類,這三個類分表表明瞭字符串類型、數據流類型和二進制類型,那麼數據流類型和二進制類型是能夠互相轉換的區別不大。調用PostAsync方法以後會返回一個HttpResponseMessage對象,經過這個HTTP的相應消息對象咱們就能夠獲取Post請求以後的返回的結果信息。Post請求發送字符串和數據流數據的代碼示例以下所示:異步
(1)Post請求發送字符串數據網站
HttpStringContent httpStringContent = new HttpStringContent("hello Windows Phone"); HttpResponseMessage response = await httpClient.PostAsync(uri, httpStringContent).AsTask(cts.Token); string responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token);
(2)Post請求發送數據流數據
HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream()); HttpResponseMessage response = await httpClient.PostAsync(uri, streamContent).AsTask(cts.Token); string responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token);
除了使用PostAsync方法以外,咱們還可使用SendRequestAsync方法來發送網絡請求,SendRequestAsync方法既可使用Get方式也可使用Post方式。SendRequestAsync方法發送的消息類型是HttpRequestMessage類對象,HttpRequestMessage類表示HTTP的請求消息類,你能夠經過HttpRequestMessage對象設置請求的類型(Get/Post)和傳輸的數據對象。使用SendRequestAsync方法的代碼示例以下所示:
// 建立HttpRequestMessage對象 HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream()); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri(resourceAddress)); request.Content = streamContent; // 發送數據 HttpResponseMessage response = await httpClient.SendRequestAsync(request).AsTask(cts.Token); string responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token);
Cookie是指某些網站爲了辨別用戶身份、進行回話跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。那麼當咱們在使用HTTP請求的時候,若是服務器返回的數據待用Cookie數據,咱們也是能夠獲取出來,存儲在本地,下次發起HTTP請求的時候就會帶上這些Cookie的數據。
在HttpClient類的網絡請求中咱們能夠經過HttpBaseProtocolFilter類來獲取網站的Cookie信息,HttpBaseProtocolFilter類表示是HttpClient的HTTP請求的基礎協議的過濾器。獲取Cookie的代碼示例以下所示:
// 建立一個HttpBaseProtocolFilter對象 HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); // 經過HttpBaseProtocolFilter對象獲取使用HttpClient進行過網絡請求的地址的Cookie信息 HttpCookieCollection cookieCollection = filter.CookieManager.GetCookies(new Uri(resourceAddress)); // 遍歷整個Cookie集合的Cookie信息 foreach (HttpCookie cookie in cookieCollection) { }
固然咱們在發送HTTP請求的時候也同樣能夠帶上Cookie信息,若是服務器能夠識別到Cookie信息那麼就會經過Cookie信息來進行一些操做,好比Cookie信息信息帶有用戶名和密碼的加密信息,那麼就能夠免去登錄的步驟。在HttpClient的網路請求裏面HttpCookie類表示是一個Cookie對象,建立好Cookie對象以後經過HttpBaseProtocolFilter對象的CookieManager屬性來設置Cookie,而後發送網絡請求,這時候的網絡請求就會把Cookie信息給帶上。設置Cookie的代碼示例以下所示:
// 建立一個HttpCookie對象,"id"表示是Cookie的名稱,"localhost"是主機名,"/"是表示服務器的虛擬路徑 HttpCookie cookie = new HttpCookie("id", "yourwebsite.com", "/"); // 設置Cookie的值 cookie.Value = "123456"; // 設置Cookie存活的時間,若是設置爲null表示只是在一個會話裏面生效 cookie.Expires = new DateTimeOffset(DateTime.Now, new TimeSpan(0, 1, 8)); // 在過濾器裏面設置Cookie HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); bool replaced = filter.CookieManager.SetCookie(cookie, false);
……接下來能夠向"yourwebsite.com"遠程主機發起請求
HttpClient的網絡請求是支持進度監控,經過異步任務的IProgress<T>對象能夠直接監控到HttpClient的網絡請求返回的進度信息,返回的進度對象是HttpProgress類對象。在進度對象HttpProgress裏面包含了下面的一些信息:Stage(當前的狀態)、BytesSent(已發送的數據大小)、BytesReceived(已接收的數據大小)、Retries(重試的次數)、TotalBytesToSend(總共須要發送的數據大小)和TotalBytesToReceive(總共須要接收的數據大小)。網絡請求進度監控的代碼示例以下所示:
// 建立IProgress<HttpProgress>對象 IProgress<HttpProgress> progress = new Progress<HttpProgress>(ProgressHandler); // 在異步任務中加入進度監控 HttpResponseMessage response = await httpClient.PostAsync(new Uri(resourceAddress), streamContent).AsTask(cts.Token, progress); // 進度監控的回調方法 private void ProgressHandler(HttpProgress progress) { // 在這裏能夠經過progress參數獲取到進度的相關信息 }
本文來源於《深刻淺出Windows Phone 8.1 應用開發》
WP8.1 Runtime文章列表:http://www.cnblogs.com/linzheng/p/3998037.html
源代碼下載:http://vdisk.weibo.com/s/zt_pyrfNHb99O
歡迎關注個人微博@WP林政 微信公衆號:wp開發(號:wpkaifa)
WP8.1技術交流羣:372552293