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