當咱們在用 .NET 調用 RestAPI 時一般有三種選擇,分別爲:WebClient, HttpWebRequest,HttpClient
,這篇文章咱們將會討論如何使用這三種方式去調用 RestAPI,我還會提供相應的代碼案例來幫助你更好的理解這三者的概念和使用方式,簡單來講:html
HttpWebRequest
是一種相對底層的處理 Http request/response 的方式。web
WebClient
提供了對 HttpWebRequest 的高層封裝,來簡化使用者的調用。api
HttpClient
是一種新的處理 Http request/response 工具包,具備更高的性能。cookie
接下來咱們討論一下抽象類 WebRequest
。異步
WebRequest 是一種基於特定的 http 實現, 它是一個抽象類, 因此在處理 Reqeust 請求時底層會根據傳進來的 url 生成相應的子類,如:HttpWebRequest 或 FileWebRequest ,下面的代碼展現瞭如何使用 WebRequest。socket
WebRequest webRequest = WebRequest.Create(uri); webRequest.Credentials = CredentialCache.DefaultCredentials; webRequest.Method ="GET"; HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
WebRequest 是 .NET Framework 中第一個用來處理 Http 請求的類,在處理 Http請求和響應
方面給調用者提供了諸多的靈活性,你還能夠使用這個類來存取 headers, cookies, protocols 和 timeouts 等等,下面的代碼展現了其實現子類 HttpWebRequest 是如何使用的。async
HttpWebRequest http = HttpWebRequest)WebRequest.Create(「http://localhost:8900/api/default」); WebResponse response = http.GetResponse(); MemoryStream memoryStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(memoryStream); string data = streamReader.ReadToEnd();
WebClient 是 HttpWebRequest 的高層封裝,它給調用者提供了更便捷的使用方式,理所固然作出的犧牲就是 WebClient 的性能略遜於 HttpWebRequest,若是你的業務場景只是簡單訪問第三方的 Http Service,那麼我建議你使用 WebClient ,同理若是你有更多的精細化配置則使用 HttpWebRequest,下面的代碼展現瞭如何使用 WebClient 。工具
string data = null; using (var webClient = new WebClient()) { data = webClient.DownloadString(url); }
HttpClient 是在 .NET Framework 4.5 中被引入的,若是你的項目是基於 .NET 4.5 以上版本,除一些特定的緣由以外,建議你優先使用 HttpClient,本質上來講,HttpClient 做爲後來之物,它吸收了 HttpWebRequest 的靈活性及 WebClient 的便捷性,因此說 🐟 和 🐻 可兼得。性能
HttpWebRequest 在 request/response
對象上提供了很是精細化的配置,同時你也要注意 HttpClient 的出現並非爲了取代 WebClient,言外之意就是 HttpClient 也有缺點,好比說:不能提供 進度處理
和 URI 定製
,不支持 FTP 等等,HttpClient 的優勢也有不少,它全部關於 IO 操做的方法都是異步的,固然有特殊緣由的話也能夠使用同步方式,下面的代碼展現瞭如何使用 HttpClient。url
public async Task<Author> GetAuthorsAsync(string uri) { Author author = null; HttpResponseMessage response = await client.GetAsync(uri); if (response.IsSuccessStatusCode) { author = await response.Content.ReadAsAsync<Author>(); } return author; }
值得注意的是當 response 出現錯誤時,默認狀況下 HttpClient 並不會拋出異常,若是你必定要求 HttpClient 在這種狀況下拋出異常,可更改 IsSuccessStatusCode = false
來改變這種默認行爲,作法就是調用 response.EnsureSuccessStatusCode();
。
public async Task<Author> GetAuthorsAsync(string uri) { Author author = null; HttpResponseMessage response = await client.GetAsync(uri); response.EnsureSuccessStatusCode(); if (response.IsSuccessStatusCode) { author = await response.Content.ReadAsAsync<Author>(); } return author; }
在項目開發中,推薦的作法是保持 HttpClient 的單例化,若是不這麼作的話,每次 Request 請求實例化一次 HttpClient ,那麼大量的請求必將你的 socket 耗盡並拋出 SocketException
異常。
譯文連接:https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html