在.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來發送。