c# 的請求類主要包括 HttpWebRequest;WebClient;HttpClient,RestSharp,其中 RestSharp是社區的網絡請求方案,這裏主要是討論各自的特定
HttpWebRequest
這個類是 .net 比較早 出的網絡請求類,可以自己控制 超時時間,cookie等比較常用的,對http協議進行了完整的封裝,對協議中的header,content等做了屬性或者方法的支持
優點:功能強大,支持的.net版本最多 缺點:使用麻煩,需要自己設置各種配置,被官方拋棄了 2333
代碼
HttpWebRequest requst = (HttpWebRequest)WebRequest.Create("https://www.baidu.com");
requst.Headers.Add("xxx");
requst.Headers.Add("xxx");
requst.CookieContainer.Add(new Cookie("xx","xxx"));
requst.Timeout = 30000;
var response = requst.GetResponse();
WebClient
這個類是一種更高几倍的抽象,也就是對httpWebRequest的進一步封裝,簡化了一些步驟
優點:使用簡單,下載文件使用方便,相對而已支持net版本也比較多 缺點:功能上有些缺失,沒有timeout等的設置,官方不更新功能,只做些修復
using (var webClinet = new WebClient())
{
webClinet.DownloadFile("address_xxx..","fileName_xxx");
}
HttpClient
這個是比較後面出的請求類,支持異步模型編程,更適合現代的網絡編程,官方主推這個,功能強大,支持單個實例發送請求,連接重複利用,佔用資源少。
優點:異步編程模型適合現代的網絡請求 缺點:請求速度上還是稍慢,越上層的封裝,越是有些損耗,但是總體問題不大,支持的net版本相對比較少,後面主要是net core方向的支持
using (var client = new HttpClient())
{
var data = client.GetStringAsync("xxxx").Result;
}
RestSharp
這個社區的貢獻,功能也是比較強大 適合rest 風格的編程,api請求友好,以下是官方的 請求案例
優點:適合api的請求風格,非常的靈活,不依賴第三方,支持net版本多 缺點:使用上還是相對比較麻煩,非微軟官方維護,依賴社區,遇到問題可能沒有相關的文檔查詢
var client = new RestClient("http://example.com");
// client.Authenticator = new HttpBasicAuthenticator(username, password);
var request = new RestRequest("resource/{id}", Method.POST);
request.AddParameter("name", "value"); // adds to POST or URL querystring based on Method
request.AddUrlSegment("id", "123"); // replaces matching token in request.Resource
// easily add HTTP Headers
request.AddHeader("header", "value");
// add files to upload (works with compatible verbs)
request.AddFile(path);
// execute the request
IRestResponse response = client.Execute(request);
var content = response.Content; // raw content as string
// or automatically deserialize result
// return content type is sniffed but can be explicitly set via RestClient.AddHandler();
RestResponse<Person> response2 = client.Execute<Person>(request);
var name = response2.Data.Name;
// easy async support
client.ExecuteAsync(request, response => {
Console.WriteLine(response.Content);
});
// async with deserialization
var asyncHandle = client.ExecuteAsync<Person>(request, response => {
Console.WriteLine(response.Data.Name);
});
// abort the request on demand
asyncHandle.Abort();