介紹
當我們在開發客戶端還有少部分服務端程序時,數據需要從 Webapi 服務器取得。在以前我使用的比較多的時 WebClient 和 HttpWebRequese,在新的 .Net 版本中,團隊為其帶來了更多的可選擇性——新的 HttpClient。它有着更加靈活的 API。發送請求和接收響應主要是通過 HttpRequestMessage 和 HttpResponseMessage 這來給你個類,通過屬性 Content 獲取 http 響應內容。
區別
HttpClient 與 WebClient 和 HttpWebRequest 相比,有以下幾個主義的
- HttpClient 實例初始化時不與服務器域名或者主機地址綁定,也就是說可以通過一個 HttpClient 實例發送多個不同的請求(比如同一個 HttpClient 請求 http://api.a.com 和 http://api.b.com 兩個服務器數據)
- HttpClient 通過設置 DefaultHeaders 設置 HttpHeader 並且應用於該實例的所有請求
- HttpClient 使用可以很容易的處理異步請求(Async / Await)
使用方法
HttpClient 提供有與 Http Method 匹配的方法,比如 GET / POST / PUT ...等。
先實現模擬一個 GET 請求,代碼如下
// 傳入參數 url 為請求地址 async Task Get(string uri = "http://api.domain.com/search";) { // 使用 using 語法建立一個明確周期的 HttpClient 實例 using (HttpClient client = new HttpClient()) { try { // 設置超時限制,有效防止浪費資源 client.Timeout = TimeSpan.FromSeconds(30); //使用 GetAsync 進行異步 HTTPGET 請求 HttpResponseMessage response = await client.GetAsync(uri); // 判斷服務器響應代碼是否為 2XX response.EnsureSuccessStatusCode(); //使用 await 語法讀取響應內容 string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } catch (HttpRequestException e) { Console.WriteLine("Error Message :{0} ", e.Message); } } }
除了直接使用與 Http Method 對應的方法外,還可以單獨構建 HttpRequestMessage 實例進行請求
async Task Get(string uri = "http://api.domain.com/search";) { using (HttpClient client = new HttpClient()) { HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Get, uri); await client.SendAsync(httpRequest) .ContinueWith(responseTask => { Console.WriteLine("Response: {0}", responseTask.Result); }); } }
至於 Post 請求,對於初次接觸 HttpClient 的人可能顯得有些復雜,比較折騰,另一篇文章再講解。
最后一點,對於不想折騰的人,建議直接使用 RestSharp ,簡單好用,上手容易。
轉自https://zhuanlan.zhihu.com/p/213733869?utm_source=wechat_session