.NET中HttpWebRequest、WebClient、HttpClient的区别
1、HttpWebRequest
这是.NET创建者最初开发⽤于使⽤HTTP请求的标准类。使⽤HttpWebRequest可以让开发者控制请求/响应流程的各个⽅⾯,如timeouts, cookies, headers, protocols。另⼀个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载⼤⽂件时,您的应⽤程序的UI不会停⽌响应。
如果对http协议不是了如指掌,使⽤HttpWebRequest会增加你的开发成本,除⾮你需要⾮常细节的处理和底层的控制,另外HttpWebRequest库已经过时,不适合业务中直接使⽤,他更适⽤于框架内部操作。
当想要资源发送数据时,GetRequestStream⽅法返回⽤于发送数据的Stream对象。BeginGetRequestStream和EndGetRequestStream⽅法提供发送数据流的异步访问。
发送Get请求
//建⽴请求
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("");
//发送请求获取Http响应
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
//获取响应流
Stream receiveStream = response.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());
发送Post请求
public static void Main()
{
//建⽴请求
HttpWebRequest request=(HttpWebRequest)WebRequest.Create("");
aspnet和net的区别request.Method="Post";
string inputData=Console.ReadLine();
string postData="firstnone="+inputData;
ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] byte1=encoding.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
Stream newStream = request.GetRequestStream ();
newStream.Write (byte1, 0, byte1.Length);
HttpWebResponse response=(HttpWebResponse)request.GetResponse();
Stream myStream = HttpResp.GetResponseStream();
StreamReader reader = new StreamReader(myStream, code);
}
2、WebClient
WebClient是⼀种更⾼级别的抽象,是HttpWebRequest为了简化最常见任务⽽创建的,使⽤过程中你会发现他缺少基本的
header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。使⽤WebClient可能⽐HttpWebRequest直接使⽤更慢(⼤约⼏毫秒)。但这种“低效率”带来了巨⼤的好处:它需要更少的代码和隐藏了细节处理,更容易使⽤,并且在使⽤它时你不太可能犯错误。同样的请求⽰例现在很简单只需要两⾏⽽且内部周到的处理完了细节:
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile("example", "路径");
}
附⼀个简单的Post请求代码⽰例:
WebClient webClient = new WebClient();
// 向服务器发送POST数据
byte[] responseArray = webClient.UploadValues(url, postValues);
string response = Encoding.UTF8.GetString(responseArray);
returns = response;
3、HttpClient
HttpClient是.NET4.5引⼊的⼀个HTTP客户端库,其命名空间为System.Net.Http。.NET 4.5之前我们可能使⽤WebClient和HttpWebRequest来达到相同⽬的。但是有⼏点值得关注:
可以使⽤单个HttpClient实例发任意数⽬的请求
⼀个HttpClient实例不会跟某个HTTP服务器或主机绑定,也就是说我们可以⽤⼀个实例同时给www.a和www.b发请求
可以继承HttpClient达到定制⽬的
HttpClient利⽤了最新的⾯向任务模式,使得处理异步请求⾮常容易.
知识点整理:
1、为了获得HttpConet对象中的数据,在本例中使⽤了Result属性,调⽤Result会阻塞该调⽤。还可以使⽤ReadAsStringAsync⽅法,这是⼀个异步调⽤。
2、Http的DefaultRequestHeaders属性允许设置或该变标题,使⽤Add属性可以给集合添加标题。设置标题后标题与标题值会与这个HttpClient实例发送的每个请求⼀起发送。
3、HttpClient可以把HttpMessageHandler作为其构造函数的参数,这样就可以定制请求。可以传递HttpClientHandler的实例。它有许多属性可以设置,如ClientCertificates、ContinueTimeout等。
代码实例(Post异步请求)
using (var client = new HttpClient(handler))
{
action = action.TrimEnd();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
header = ApiHeaderCompent.AddHeader(requestUri, action, body, header,
HttpMethod.Post, appContext, context);
header?.ForEach(p => client.DefaultRequestHeaders.Add(p.Key, p.Value));
result = client.PostAsJsonAsync(requestUri + action, body).Result;
if (!result.IsSuccessStatusCode)
throw new Exception($"API POST 请求失败,请求地址: {requestUri + action}");
var data = JsonConvert.DeserializeObject<T>(result.Content.ReadAsStringAsync().Result);
return new ApiResult<T>(data);
}
Get异步请求⽰例
using(var client =new HttpClient(handler))
{
action = action.TrimEnd();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
header = ApiHeaderCompent.AddHeader(requestUri, action,null, header, HttpMethod.Get, appContext, context);
header?.ForEach(p => client.DefaultRequestHeaders.Add(p.Key, p.Value));
result = client.GetAsync(requestUri + action).Result;
if(!result.IsSuccessStatusCode)
throw new Exception($"API GET 请求失败,请求地址: {requestUri + action}");
var data = JsonConvert.DeserializeObject<T>(result.Content.ReadAsStringAsync().Result);
return new ApiResult<T>(data);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论