模拟网络请求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 Task 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",
      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)