.NET Core C#系列之XiaoFeng.Http模拟请求库HttpHelper帮助类库
模拟Http请求
模拟请求就是传说中的 爬虫 工具所用的都是模拟请求。
先作一下请求类型科普。
请求类型包括 GET,POST,PUT,HEAD,OPTIONS,DELETE,TRACE,PATCH。
GET 从指定的资源请求数据。
获取数据
POST 向指定的资源提交要被处理的数据。
提交数据
HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。
获取内容头
PUT 向指定资源位置上传其最新内容。
更新数据
OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。
获取服务器所支持的请求类型
DELETE 请求服务器删除Request-URI所标识的资源。
删除数据
TRACE 回显服务器收到的请求,主要用于测试或诊断。
测试服务器性能
PATCH 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
验证数据差异
进入正题,怎么使用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 Task<HttpResponse> GetResponseAsync(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"
});
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");
更多的请求参数设置详细可以看IHttpRequest接口说明,当前类库基本就是这样使用。
开源地址:https://github.com/zhuovi/XiaoFeng
语雀地址:https://www.yuque.com/fayelf/xiaofeng
开源不易,多多支持~