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();
1
2
3
4
5
6
WebClient
这个类是一种更高几倍的抽象,也就是对httpWebRequest的进一步封装,简化了一些步骤
优点:使用简单,下载文件使用方便,相对而已支持net版本也比较多 缺点:功能上有些缺失,没有timeout等的设置,官方不更新功能,只做些修复
using (var webClinet = new WebClient())
{
webClinet.DownloadFile("address_xxx..","fileName_xxx");
}
1
2
3
4
HttpClient
这个是比较后面出的请求类,支持异步模型编程,更适合现代的网络编程,官方主推这个,功能强大,支持单个实例发送请求,连接重复利用,占用资源少。
优点:异步编程模型适合现代的网络请求 缺点:请求速度上还是稍慢,越上层的封装,越是有些损耗,但是总体问题不大,支持的net版本相对比较少,后面主要是net core方向的支持
using (var client = new HttpClient())
{
var data = client.GetStringAsync("xxxx").Result;
}
1
2
3
4
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();