-
模拟网络请求HttpHelper作者 : 管理员 发布于 2023-04-25 23:16:53 浏览 641 次模拟Http请求类型包括 GET,POST,PUT,HEAD,OPTIONS,DELETE,TRACE,PATCH,CONNECT
模拟Http请求
模拟请求就是传说中的 爬虫 工具所用的都是模拟请求。
先作一下请求类型科普。
请求类型包括 GET,POST,PUT,HEAD,OPTIONS,DELETE,TRACE,PATCH,CONNECT。GET 从指定的资源请求数据。
获取数据POST 向指定的资源提交要被处理的数据。
提交数据HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。
获取内容头PUT 向指定资源位置上传其最新内容。
更新数据OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。
获取服务器所支持的请求类型DELETE 请求服务器删除Request-URI所标识的资源。
删除数据TRACE 回显服务器收到的请求,主要用于测试或诊断。
测试服务器性能PATCH 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
验证数据差异CONNECT 方法用来建立到给定URI标识的服务器的隧道;它通过简单的TCP / IP隧道更改请求连接,通常实使用解码的HTTP代理来进行SSL编码的通信(HTTPS)。
进入正题,怎么使用XiaoFeng组件中的HttpHelper类,HttpHelper 有静态方法也有实例方法。
当前类库所在命名空间是:XiaoFeng.Http
静态方法
1.XiaoFeng.Http.HttpHelper.Instance
单例变量,当前变量相当于 实例化了一个 HttpHelper对象 只不过所有操作中都用的是单例。
2.XiaoFeng.Http.HttpHelper.GetHtml
请求数据同步方法
3.XiaoFeng.Http.HttpHelper.GetHtmlAsync
请求数据异步方法
以上两个方法都调用的Instance单例去实现的请求方法
下边会详细讲解实例类中的方法
动态方法/// <summary> /// CURL请求 /// </summary> /// <param name="url">地址</param> /// <param name="formData">formdata</param> /// <returns></returns> public async Task<HttpResponse> CURLAsync(string url, List<FormData> formData) /// <summary> /// CURL请求 /// </summary> /// <param name="url">地址</param> /// <param name="formData">formdata</param> /// <returns></returns> public HttpResponse CURL(string url, List<FormData> formData) /// <summary> /// 下载文件 /// </summary> /// <param name="url">远程地址</param> /// <param name="localPath">保存地址</param> /// <returns></returns> public void DownFile(string url, string localPath) /// <summary> /// 下载文件 /// </summary> /// <param name="request">请求对象</param> /// <param name="localPath">保存地址</param> /// <returns></returns> public void DownFile(HttpRequest request, string localPath) /// <summary> /// 下载文件 /// </summary> /// <param name="url">远程地址</param> /// <param name="localPath">保存地址</param> /// <returns></returns> public async Task DownFileAsync(string url, string localPath) /// <summary> /// 下载文件 /// </summary> /// <param name="request">请求对象</param> /// <param name="localPath">保存地址</param> /// <returns></returns> public async Task DownFileAsync(HttpRequest request, string localPath) /// <summary> /// 获取Http内容 /// </summary> /// <param name="request">请求对象</param> /// <returns></returns> public async Task<HttpResponse> GetResponseAsync(HttpRequest request) /// <summary> /// 获取Http内容 /// </summary> /// <param name="url">网址</param> /// <returns></returns> public async Task<HttpResponse> GetResponseAsync(string url) /// <summary> /// 获取Http内容 /// </summary> /// <param name="request">请求对象</param> /// <returns></returns> public HttpResponse GetResponse(HttpRequest request) /// <summary> /// 获取Http内容 /// </summary> /// <param name="url">网址</param> /// <returns></returns> public HttpResponse GetResponse(string url)
上边所有的方法都是在
public async TaskGetResponseAsync(HttpRequest request)
这个方法下衍生出来的,我们下边主要讲解当前方法的使用方法,在讲解当前方法之前 还介绍一下请求对象以及响应对象
请求对象接口如下/// <summary> /// 请求对象接口 /// </summary> public interface IHttpRequest : IHttpBase { /// <summary> /// 操作是在响应可利用时立即视为已完成,还是在读取包含上下文的整个答案信息之后才视为已完成。 /// </summary> HttpCompletionOption CompletionOption { get; set; } /// <summary> /// 设置Host的标头信息 /// </summary> string Host { get; set; } /// <summary> /// 获取或设置与此响应关联的 Cookie /// </summary> string Cookies { set; } /// <summary> /// 请求网址 /// </summary> string Address { get; set; } /// <summary> /// 请求内容 /// </summary> HttpContent HttpContent { get; set; } /// <summary> /// 请求网址编码 /// </summary> Encoding Encoding { get; set; } /// <summary> /// 获取或设置 User-agent HTTP 标头的值。 /// </summary> string UserAgent { get; set; } /// <summary> /// 请求超时时间 单位为毫秒 /// </summary> int Timeout { get; set; } /// <summary> /// 默认写入Post数据超时时间 单位为毫秒 /// </summary> int ReadWriteTimeout { get; set; } /// <summary> /// 请求标头值 默认为text/html, application/xhtml+xml, */* /// </summary> string Accept { get; set; } /// <summary> /// 获取或设置一个值,该值指示请求是否应跟随重定向响应。 /// </summary> Boolean AllowAutoRedirect { get; set; } /// <summary> /// 获取或设置请求将跟随的重定向的最大数目。 /// </summary> int MaximumAutomaticRedirections { get; set; } /// <summary> /// 获取或设置一个值,该值指示是否与 Internet 资源建立持久性连接。 /// </summary> Boolean KeepAlive { get; set; } /// <summary> /// 设置509证书集合 /// </summary> X509Certificate2Collection ClentCertificates { get; set; } /// <summary> /// 获取和设置IfModifiedSince,默认为当前日期和时间 /// </summary> DateTime? IfModifiedSince { get; set; } /// <summary> /// 设置本地的出口ip和端口 /// </summary> IPEndPoint IPEndPoint { get; set; } /// <summary> /// 获取或设置请求的身份验证信息。 /// </summary> ICredentials ICredentials { get; set; } /// <summary> /// 指定 Schannel 安全包支持的安全协议 /// </summary> SecurityProtocolType ProtocolType { get; set; } /// <summary> /// 获取或设置用于请求的 HTTP 版本。返回结果:用于请求的 HTTP 版本。默认为 System.Net.HttpVersion.Version11。 /// </summary> Version ProtocolVersion { get; set; } /// <summary> /// 获取或设置一个 System.Boolean 值,该值确定是否使用 100-Continue 行为。如果 POST 请求需要 100-Continue 响应,则为 true;否则为 false。默认值为 true。 /// </summary> Boolean Expect100Continue { get; set; } /// <summary> /// 证书绝对路径 /// </summary> string CertPath { get; set; } /// <summary> /// 证书密码 /// </summary> string CertPassWord { get; set; } /// <summary> /// 最大连接数 /// </summary> int Connectionlimit { get; set; } /// <summary> /// Http 代理 /// </summary> WebProxy WebProxy { get; set; } /// <summary> /// 获取或设置 Referer HTTP 标头的值。 /// </summary> string Referer { get; set; } /// <summary> /// 数据(参数数据或post表单数据) /// </summary> Dictionary<string, string> Data { get; set; } /// <summary> /// Body请求数据 /// </summary> string BodyData { get; set; } /// <summary> /// FormData数据 /// </summary> List<FormData> FormData { get; set; } /// <summary> /// 请求完后是否重置请求对象以及响应对象 /// </summary> Boolean IsReset { get; set; } /// <summary> /// 请求消息 /// </summary> HttpRequestMessage Request { get; set; } /// <summary> /// 压缩方式 /// </summary> DecompressionMethods DecompressionMethod { get; set; } /// <summary> /// 获取响应数据 /// </summary> /// <returns></returns> Task<HttpResponse> GetResponseAsync(); /// <summary> /// 取消请求 /// </summary> void Abort(); /// <summary> /// 添加Cookie /// </summary> /// <param name="name">名称</param> /// <param name="value">值</param> void AddCookie(string name, string value); /// <summary> /// 添加Cookie /// </summary> /// <param name="cookie">cookie</param> void AddCookie(Cookie cookie); /// <summary> /// 添加Cookie /// </summary> /// <param name="collection">cookie集</param> void AddCookie(CookieCollection collection); }
响应对象接口
/// <summary> /// 响应对象接口 /// </summary> interface IHttpResponse : IHttpBase { /// <summary> /// 响应对象 /// </summary> HttpResponseMessage Response { get; set; } /// <summary> /// 获取响应请求的 Internet 资源的 URI。 /// </summary> Uri ResponseUri { get; set; } /// <summary> /// 获取响应中使用的 HTTP 协议的版本。 /// </summary> Version ProtocolVersion { get; set; } /// <summary> /// 获取与响应一起返回的状态说明。 /// </summary> string StatusDescription { get; set; } /// <summary> /// 获取响应的状态。 /// </summary> HttpStatusCode StatusCode { get; set; } /// <summary> /// 获取最后一次修改响应内容的日期和时间。 /// </summary> DateTimeOffset? LastModified { get; set; } /// <summary> /// 获取发送响应的服务器的名称。 /// </summary> string Server { get; set; } /// <summary> /// 获取响应的字符集。 /// </summary> string CharacterSet { get; set; } /// <summary> /// 获取用于对响应体进行编码的方法。 /// </summary> string ContentEncoding { get; set; } /// <summary> /// 获取请求返回的内容的长度。 /// </summary> long ContentLength { get; set; } /// <summary> /// 结果字节集 /// </summary> byte[] Data { get; set; } /// <summary> /// 响应内容 /// </summary> string Html { get; } /// <summary> /// 下载文件 /// </summary> /// <param name="path">文件保存路径</param> /// <returns></returns> Task DownFileAsync(string path); /// <summary> /// 获取Cookie /// </summary> /// <param name="key">key</param> /// <returns></returns> Cookie GetCookie(string key); /// <summary> /// 获取Cookie /// </summary> /// <param name="key">key</param> /// <returns></returns> string GetCookieValue(string key); }
请求实例:
1.一般的Get请求var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Get,//不设置默认为Get请求 Address = "http://www.fayelf.com", HttpCore = HttpCore.HttpClient//可设置运行内核,一共分三种HttpClient,HttpWebRequest,HttpSocket //如果不设置默认用的是HttpClient请求 }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /*请求成功*/ //响应内容 var value = result.Html; //响应内容字节集 var bytes = result.Data; } else { /*请求失败*/ }
2.Post表单请求
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Post, Address = "http://www.fayelf.com", Data=new Dictionary<string, string> { {"account","jacky" }, {"password","123456" } } }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /*请求成功*/ //响应内容 var value = result.Html; //响应内容字节集 var bytes = result.Data; } else { /*请求失败*/ }
3.Post body请求
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Post, ContentType="application/json", Address = "http://www.fayelf.com", BodyData=@"{""account"":""jacky"",""password"":""123456""}" }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /*请求成功*/ //响应内容 var value = result.Html; //响应内容字节集 var bytes = result.Data; } else { /*请求失败*/ }
4.Post FormData请求,就是有表单输入数据也有文件数据
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Post, ContentType = "application/x-www-form-urlencoded", Address = "http://www.fayelf.com", FormData = new List<XiaoFeng.Http.FormData> { new XiaoFeng.Http.FormData { Name="account",Value="jacky", FormType= XiaoFeng.Http.FormType.Text }, new XiaoFeng.Http.FormData { Name="password",Value="123456",FormType= XiaoFeng.Http.FormType.Text }, new XiaoFeng.Http.FormData { Name="headimage",Value=@"E://Work/headimage.png", FormType= XiaoFeng.Http.FormType.File } } }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /*请求成功*/ //响应内容 var value = result.Html; //响应内容字节集 var bytes = result.Data; } else { /*请求失败*/ }
5.下载文件
await XiaoFeng.Http.HttpHelper.Instance.DownFileAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Get, Address = "http://www.fayelf.com/test.rar" }, @"E:/Work/test.rar");
6.也可以连续设置参数
var result = await new HttpRequest("http://www.fayelf.com").SetMethod(HttpMethod.Post).AddHeader("token", "xiaofeng.mvc").AddParameter("a", "a1").AddParameter("b", "b1").GetResponseAsync();
也就是可以在一行内把所有的参数通过方法去添加设置。
更多的请求参数设置详细可以看IHttpRequest接口说明,当前类库基本就是这样使用。所有评论(0)