[深刻淺出WP8.1(Runtime)]網絡編程之HttpClient類

12.2 網絡編程之HttpClient類

    除了可使用HttpWebRequest類來實現HTTP網絡請求以外,咱們還可使用HttpClient類來實現。對於基本的請求操做,HttpClient類提供了一個簡單的接口來處理最多見的任務,併爲身份驗證提供了適用於大多數方案的合理的默認設置。對於較爲複雜的 HTTP 操做,更多的功能包括:執行常見操做(DELETE、GET、PUT 和 POST)的方法;獲取、設置和刪除 Cookie 的功能;支持常見的身份驗證設置和模式;異步方法上提供的 HTTP 請求進度信息;訪問有關傳輸的安全套接字層 (SSL) 詳細信息;在高級應用中包含自定義篩選器的功能等。html

12.2.1 Get請求獲取字符串和數據流數據

    (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();

    }

 

12.2.2 Post請求發送字符串和數據流數據

    使用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);

 

12.2.3 設置和獲取Cookie

    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"遠程主機發起請求

12.2.4 網絡請求的進度監控

    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

相關文章
相關標籤/搜索