.NET 4.5(C#): 使用HttpClient來非同步發送POST請求並解析GZIP回應

來源:互聯網
上載者:User

在.NET 4.0和C# 4.0的時代,寫成非同步話,這將會寫比較多的代碼,而且我保證代碼不會很好看,因為一大堆APM非同步執行代碼的結果就是要麼一層一層的嵌套Lambda,要麼一段邏輯被迫分割成一堆方法。

 

另一個之前的缺陷就是使用者必須手動把URL參數編碼並且正確串連然後放入到HTTP請求中,而.NET 4.5中的HttpContent類型的多個衍生類別型可以支援更快捷的HTTP資料內容建立,我們可以使用FormUrlEncodedContent來完成上述需求。

 

另一個就是自動解壓縮HTTP回應中的GZIP,.NET 4.0中在HttpWebRequest的AutomaticDecompression屬性中,在.NET 4.5中的HttpClient類型中,可以使用HttpClientHandler的AutomaticDecompression屬性,前後兩者對應值都是DecompressionMethods枚舉類型,這個類型在.NET 2.0就有了。因此命名空間在System.Net中。

 

我們可以拿一個API來做示範,整個代碼如下:

//+ using System.Net;

//+ using System.Net.Http;

 

static void Main(string[] args)

{

    doo();

    System.Threading.Thread.Sleep(-1);

}

 

static async void doo()

{

    //設定必要參數

    //樣本API可以參考:http://dev.jiepang.com/doc/get/users/show

    var url = "http://api.jiepang.com/v1/users/show";

    var userId = "772653441";

    var source = "Mgen.Orca";

 

    //設定HttpClientHandler的AutomaticDecompression

    var handler = new HttpClientHandler()

    { AutomaticDecompression = DecompressionMethods.GZip };

 

    //建立HttpClient(注意傳入HttpClientHandler)

    using (var http = new HttpClient(handler))

    {

        //使用FormUrlEncodedContent做HttpContent

        var content = new FormUrlEncodedContent(new Dictionary<string, string>()

        {

            {"id", userId},

            {"source", source},

            {"force_gzip", "1"}

        });

 

        //await非同步等待回應

        var response = await http.PostAsync(url, content);

 

        //確保HTTP成功狀態值

        response.EnsureSuccessStatusCode();

 

        //await非同步讀取最後的JSON(注意此時gzip已經被自動解壓縮了,因為上面的AutomaticDecompression = DecompressionMethods.GZip)

        Console.WriteLine(await response.Content.ReadAsStringAsync());

    }

}

 

運行後,有網路的話會輸出帳號的Json資訊!

 

上述API使用了一個顯示參數來指定需要返回GZIP資料回應,也可以通過設定HTTP請求的AcceptEncoding,如下,手動加入GZIP類型:

//http是HttpClient對象

//也可以手動構建HttpRequestMessage,然後通過HttpClient.SendAsync來發送

http.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("GZIP"));

 

http是HttpClient對象,它的DefaultRequestHeaders返回HttpRequestHeaders對象。當然也可以手動構建HttpRequestMessage然後修改HttpRequestHeaders,然後通過HttpClient.SendAsync來發送。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.