1.WebRequest和HttpWebRequest

  WebRequest 的命名空间是: System.Net ,它是HttpWebRequest的抽象父类(还有其他子类如FileWebRequest ,FtpWebRequest),WebRequest的子类都用于从web获取资源。HttpWebRequest利用HTTP 协议和服务器交互,通常是通过 GET 和 POST 两种方式来对数据进行获取和提交

一个栗子:

        static void Main(string[] args)
{
// 创建一个WebRequest实例(默认get方式)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.baidu.com");
//可以指定请求的类型
//request.Method = "POST";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine(response.StatusDescription);
// 接收数据
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine(responseFromServer);
// 关闭stream和response
reader.Close();
dataStream.Close();
response.Close();
}

运行后输出百度网页的html字符串,如下:

2.HttpRequest

  HttpRequest类的命名空间是:System.Web,它是一个密封类,其作用是让服务端读取客户端发送的请求,我们最熟悉的HttpRequest的实例应该是WebForm中Page类的属性Request了,我们可以轻松地从Request属性的QueryString,Form,Cookies集合获取数据中,也可以通过Request["Key"]获取自定义数据,一个栗子:
            protected void Page_Load(object sender, EventArgs e)
{
//从Request中获取商品Id
string rawId = Request["ProductID"];
int productId;
if (!String.IsNullOrEmpty(rawId) && int.TryParse(rawId, out productId))
{
//把商品放入购物车
using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
{
usersShoppingCart.AddToCart(productId);
}
}
else
{
throw new Exception("Tried to call AddToCart.aspx without setting a ProductId.");
}
//跳转到购物车页面
Response.Redirect("ShoppingCart.aspx");
}

3.WebClient

  命名空间是System.Net,WebClient很轻量级的访问Internet资源的类,在指定uri后可以发送和接受数据。WebClient提供了 DownLoadData,DownLoadFile,UploadData,UploadFile 方法,同时通过了这些方法对应的异步方法,通过WebClient我们可以很方便地上传和下载文件。

简单使用:

static void Main(string[] args)
{
WebClient wc = new WebClient();
wc.BaseAddress = "http://www.baidu.com/"; //设置根目录
wc.Encoding = Encoding.UTF8; //设置按照何种编码访问,如果不加此行,获取到的字符串中文将是乱码
string str = wc.DownloadString("/"); //字符串形式返回资源
Console.WriteLine(str); //----------------------以下为OpenRead()以流的方式读取----------------------
wc.Headers.Add("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
wc.Headers.Add("Accept-Language", "zh-cn");
wc.Headers.Add("UA-CPU", "x86");
//wc.Headers.Add("Accept-Encoding","gzip, deflate"); //因为我们的程序无法进行gzip解码所以如果这样请求获得的资源可能无法解码。当然我们可以给程序加入gzip处理的模块 那是题外话了。
wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
//Headers 用于添加添加请求的头信息
Stream objStream = wc.OpenRead("?tn=98050039_dg&ch=1"); //获取访问流
StreamReader _read = new StreamReader(objStream, Encoding.UTF8); //新建一个读取流,用指定的编码读取,此处是utf-8
Console.Write(_read.ReadToEnd()); //输出读取到的字符串 //------------------------DownloadFile下载文件-------------------------------
wc.DownloadFile("http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.jpg", @"D:\123.jpg"); //将远程文件保存到本地 //------------------------DownloadFile下载到字节数组-------------------------------
byte[] bytes = wc.DownloadData("http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif");
FileStream fs = new FileStream(@"E:\123.gif", FileMode.Create);
fs.Write(bytes, , bytes.Length); fs.Flush();
WebHeaderCollection whc = wc.ResponseHeaders;
//获取响应头信息
foreach (string s in whc) {
Console.WriteLine(s + ":" + whc.Get(s));
}
Console.ReadKey();
}

一个使用WebClient下载文件的栗子:

        static void Main(string[] args)
{ WebClient wc = new WebClient(); //直接下载
Console.WriteLine("直接下载开始。。。");
wc.DownloadFile("http://www.kykan.cn/d/file/djgz/20170506/8e207019d3a8e6114bfc7f50710211c1.xlsx", @"D:\ku.xlsx");
Console.WriteLine("直接下载完成!!!"); //下载完成后输出 下载完成了吗? //异步下载
wc.DownloadFileAsync(new Uri("http://www.kykan.cn/d/file/djgz/20170506/8e207019d3a8e6114bfc7f50710211c1.xlsx"), @"D:\ku.xlsx");
wc.DownloadFileCompleted += DownCompletedEventHandler;
Console.WriteLine("do something else...");
Console.ReadKey();
} public static void DownCompletedEventHandler(object sender, AsyncCompletedEventArgs e)
{
Console.WriteLine("异步下载完成!");
}

4.HttpClient

  HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为 System.Net.Http 。.NET 4.5之前我们可能使用WebClient和HttpWebRequest来达到相同目的。HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易。

  下边是一个使用控制台程序异步请求接口的栗子:

        static void Main(string[] args)
{
const string GetUrl = "http://xxxxxxx/api/UserInfo/GetUserInfos";//查询用户列表的接口,Get方式访问
const string PostUrl = "http://xxxxxxx/api/UserInfo/AddUserInfo";//添加用户的接口,Post方式访问 //使用Get请求
GetFunc(GetUrl); UserInfo user = new UserInfo { Name = "jack", Age = };
string userStr = JsonHelper.SerializeObject(user);//序列化
//使用Post请求
PostFunc(PostUrl, userStr);
Console.ReadLine();
} /// <summary>
/// Get请求
/// </summary>
/// <param name="path"></param>
static async void GetFunc(string path)
{
//消息处理程序
HttpClientHandler handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
HttpClient httpClient = new HttpClient();
//异步get请求
HttpResponseMessage response = await httpClient.GetAsync(path);
//确保响应正常,如果响应不正常EnsureSuccessStatusCode()方法会抛出异常
response.EnsureSuccessStatusCode();
//异步读取数据,格式为String
string resultStr = await response.Content.ReadAsStringAsync();
Console.WriteLine(resultStr);
} /// <summary>
/// Post请求
/// </summary>
/// <param name="path"></param>
/// <param name="data"></param>
static async void PostFunc(string path, string data)
{
HttpClientHandler handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
HttpClient httpClient = new HttpClient(handler);
//HttpContent是HTTP实体正文和内容标头的基类。
HttpContent httpContent = new StringContent(data, Encoding.UTF8, "text/json");
//httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BasicAuth", Ticket);//验证请求头赋值
//httpContent.Headers.Add(string name,string value) //添加自定义请求头 //发送异步Post请求
HttpResponseMessage response = await httpClient.PostAsync(path, httpContent);
response.EnsureSuccessStatusCode();
string resultStr = await response.Content.ReadAsStringAsync();
Console.WriteLine(resultStr);
}
}

注意:因为HttpClient有预热机制,第一次进行访问时比较慢,所以我们最好不要用到HttpClient就new一个出来,应该使用单例或其他方式获取HttpClient的实例。上边的栗子为了演示方便直接new的HttpClient实例。

HttpClient还有很多其他功能,如附带Cookie,请求拦截等,可以参考https://www.cnblogs.com/wywnet/p/httpclient.html

参考文章:

1.https://www.cnblogs.com/wywnet/p/httpclient.html

2.https://www.cnblogs.com/kissdodog/archive/2013/02/19/2917004.html

3.https://docs.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest?redirectedfrom=MSDN&view=netframework-4.7.2

WebRequest/HttpWebRequest/HttpRequest/WebClient/HttpClient的区别的更多相关文章

  1. HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别

    HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 今天我们来聊一下他们之间的关系与区别. HttpRequest 类 .NET Fr ...

  2. WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

    NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库.如此多的http库 ...

  3. HttpWebRequest和WebClient的区别

     HttpWebRequest和WebClient的区别(From Linzheng): 1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Creat ...

  4. HttpWebRequest 改为 HttpClient 踩坑记-请求头设置

    HttpWebRequest 改为 HttpClient 踩坑记-请求头设置 Intro 这两天改了一个项目,原来的项目是.net framework 项目,里面处理 HTTP 请求使用的是 WebR ...

  5. Linux中用HttpWebRequest或WebClient访问远程https路径

    要想在Linux中用HttpWebRequest或WebClient访问远程https路径,需要作如下处理: 1,更新linux根证书(只需一次,在安装mono或安装jexus独立版后执行) sudo ...

  6. webrequest、httpwebrequest、webclient、HttpClient 四个类的区别

    一.在 framework 开发环境下: webrequest.httpwebreques  都是基于Windows Api 进行包装, webclient 是基于webrequest 进行包装:(经 ...

  7. webrequest HttpWebRequest webclient/HttpClient

    webrequest(abstract类,不可直接用) <--- (继承)---- HttpWebRequest(更好的控制请求) <--- (继承)---- webclient (简单快 ...

  8. .net学习笔记----HttpRequest,WebRequest,HttpWebRequest区别

    WebRequest是一个虚类/基类,HttpWebRequest是WebRequest的具体实现 HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所 ...

  9. HttpWebRequest、WebClient、RestSharp、HttpClient区别和用途

    HttpWebRequest 已经不推荐直接使用了,这已经作为底层机制,不适合业务代码使用,比如写爬虫的时候WebClient 不想为http细节处理而头疼的coder而生,由于内部已经处理了通用设置 ...

随机推荐

  1. L - Vases and Flowers HDU - 4614 线段树+二分

    题意 给出一排空花瓶 有两种操作  1是 从A花瓶开始放F朵花 如果当前瓶有花就跳过前往下一个 直到花用完或者 瓶子到了最后一个为止 输出 成功放花的第一个和最后一个  如果没有输出 can not. ...

  2. 大学jsp实验七--JavaBean在JSP中的应用

    值bean的应用 (1)若有如下图所示的两个JSP页面,在第一个的页面的表单中填写相应内容,提交后再显示用户的提交信息.使用JavaBean的方式实现上述效果,请写出相应的代码. bean文件:Tes ...

  3. jsp大学作业:jsp编写单选,复选判断题及得分情况

    project_1_1.jsp <%@ page contentType="text/html;charset=utf-8" language="java" ...

  4. 【XSY2719】prime 莫比乌斯反演

    题目描述 设\(f(i)\)为\(i\)的不同的质因子个数,求\(\sum_{i=1}^n2^{f(i)}\) \(n\leq{10}^{12}\) 题解 考虑\(2^{f(i)}\)的意义:有\(f ...

  5. MT【269】含参函数绝对值最大

    设函数$f(x)=ax^2+(2b+1)x-a-2$($a,b\in\mathcal R$,$a\neq 0$). (1) 若$a=-2$,求函数$y=|f(x)|$在$[0,1]$上的最大值$M(b ...

  6. [UOJ317]【NOI2017】游戏 题解

    题意 ​ 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. ​ 小 L 的赛车有三辆,分别用大写字母 A.B.C 表示.地图一共有四种,分别用小写字 ...

  7. Spring学习记录

    Java类定义配置@Configuration //标记为配置类@ComponentScan //标记为扫描当前包及子包所有标记为@Component的类@ComponentScan(basePack ...

  8. 集群概念Cluster

    系统扩展方式: scale up,向上扩展:提高主机性能等,质变: scale out,向外扩展:水平扩展,质不变量变: 集群类型: LB:Load Balancing 负载均衡集群: HA:High ...

  9. 【BZOJ5300】[CQOI2018]九连环 (高精度,FFT)

    [BZOJ5300][CQOI2018]九连环 (高精度,FFT) 题面 BZOJ 洛谷 题解 去这里看吧,多么好 #include<iostream> #include<cstdi ...

  10. LOJ#6278. 数列分块入门 2

    在一个区间上进行操作,一种操作是某个小区间都加上c,另一个查找这个区间内大于c*c的数 我们可以另外开一个数组在保存a中的每个分块内的相对值,然后每次对a加值,并把a的值赋给b,不同的是b内的各个分块 ...