http请求帮助类

http请求帮助类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Collections;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;


namespace api.HttpHelp
{
    /// <summary>
    /// http请求帮助类
    /// </summary>
    public class HttpClientHelp
    {
        /// <summary>
        /// 除了固定头之外的额外的http头,比如Add("Referer: http://wwww.baidu.com")
        /// <para>需要自己清除</para>
        /// </summary>
        public List<string> ExtraHeadList { get; set; }

        /// <summary>
        /// 固定的 的http头,每次请求都带,字典格式,方便更新
        /// <para>如:token=1234</para>
        /// <para>需要自己清除</para>
        /// </summary>
        public Dictionary<string, string> FixedHeadList { get; set; }

        /// <summary>
        /// 虚拟ip
        /// </summary>
        public string VirtualIp { get; set; }

        /// <summary>
        /// 代理
        /// </summary>
        public WebProxy Proxy { get; set; }

        /// <summary>
        /// 是否持久连接
        /// </summary>
        public bool KeepAlive { get; set; }

        /// <summary>
        /// 编码,默认utf8
        /// </summary>
        public Encoding Encoding { get; set; }

        /// <summary>
        /// 是否允许重定向
        /// </summary>
        public bool AllowAutoRedirect { get; set; }

        /// <summary>
        /// Authorization头
        /// </summary>
        public string Authorization { get; set; }

        /// <summary>
        /// 超时时间默认 30 * 1000
        /// </summary>
        public int Timeout { get; set; }

        /// <summary>
        /// 浏览器代理
        /// </summary>
        public string UserAgent { get; set; }

        /// <summary>
        /// 内容类型
        /// </summary>
        public string ContentType { get; set; }

        /// <summary>
        /// 接收类型
        /// </summary>
        public string Accept { get; set; }

        /// <summary>
        /// 引用页地址
        /// </summary>
        public string Referer { get; set; }
        /// <summary>
        /// 访问地址
        /// </summary>
        public string Url { get; set; }

        /// <summary>
        /// 获取重定向url
        /// </summary>
        public string LocationUrl => ResponseHeaders != null ? ResponseHeaders["Location"] : "";

        /// <summary>
        /// 发生了http异常的时候的Response
        /// </summary>
        public string WebExceptionResponse { get; private set; }

        /// <summary>
        /// 响应头
        /// </summary>
        public WebHeaderCollection ResponseHeaders { get; private set; }

        /// <summary>
        /// cookie对象集合容器
        /// </summary>
        public CookieContainer CookieContainer { get; set; }

        public HttpClientHelp()
        {
            Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
            UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";
            KeepAlive = true;
            CookieContainer = null;
            Timeout = 15 * 1000;
            AllowAutoRedirect = true;
            Encoding = Encoding.UTF8;
            ExtraHeadList = new List<string>();
            FixedHeadList = new Dictionary<string, string>();
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        }

        static HttpClientHelp()
        {
            ServicePointManager.DefaultConnectionLimit = 512;
        }

        public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            // 总是接受  
            return true;
        }

        /// <summary>
        /// 获取url里的主机名
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public string GetHost(string url)
        {
            return new Uri(url).Host;
        }

        string GetResponseBody(HttpWebResponse response)
        {
            if (response == null)
            {
                return string.Empty;
            }
            using (var stream = GetResponseStream(response))
            {
                var responseBody = "";
                using (var reader = new StreamReader(stream, Encoding))
                {
                    ResponseHeaders = response.Headers;
                    responseBody = reader.ReadToEnd();
                }

                return responseBody;
            }
        }


        /// <summary>
        /// 同步get
        /// </summary>
        /// <returns></returns>
        public string Get()
        {
            WebExceptionResponse = "";
            var request = (HttpWebRequest)WebRequest.Create(Url);
            request.AllowAutoRedirect = AllowAutoRedirect;
            request.Method = "GET";
            request.Accept = Accept;
            request.Referer = Referer;
            request.UserAgent = UserAgent;
            request.ContentType = ContentType;
            request.KeepAlive = KeepAlive;
            request.Proxy = Proxy;
            request.Timeout = Timeout;
            request.ReadWriteTimeout = Timeout;
            // request.ContinueTimeout = Timeout;
            ResponseHeaders = null;

            ExtraHeadList.ForEach(p => request.Headers.Add(p));
            foreach (var item in FixedHeadList)
            {
                request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
            }

            if (!string.IsNullOrEmpty(VirtualIp))
            {
                request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
                request.Headers.Add("VIA", VirtualIp);
                request.Headers.Add("REMOTE_ADDR", VirtualIp);
                request.Headers.Add("CLIENT_IP", VirtualIp);
            }

            if (!string.IsNullOrEmpty(Authorization))
            {
                request.Headers.Add("Authorization", Authorization);
            }

            if (CookieContainer != null)
            {
                request.CookieContainer = CookieContainer;
            }
            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                request.ContentType = "";
                return GetResponseBody(response);
            }
            catch (WebException ex)
            {
                WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
                throw ex;
            }
        }

        /// <summary>
        /// 同步get
        /// </summary>
        /// <returns></returns>
        public string Get_AllowAutoRedirect()
        {
            WebExceptionResponse = "";
            var request = (HttpWebRequest)WebRequest.Create(Url);
            request.AllowAutoRedirect = false;
            request.Method = "GET";
            request.Accept = Accept;
            request.Referer = Referer;
            request.UserAgent = UserAgent;
            request.ContentType = ContentType;
            request.KeepAlive = KeepAlive;
            request.Proxy = Proxy;
            request.Timeout = Timeout;
            request.ReadWriteTimeout = Timeout;
            // request.ContinueTimeout = Timeout;
            ResponseHeaders = null;

            ExtraHeadList.ForEach(p => request.Headers.Add(p));
            foreach (var item in FixedHeadList)
            {
                request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
            }

            if (!string.IsNullOrEmpty(VirtualIp))
            {
                request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
                request.Headers.Add("VIA", VirtualIp);
                request.Headers.Add("REMOTE_ADDR", VirtualIp);
                request.Headers.Add("CLIENT_IP", VirtualIp);
            }

            if (!string.IsNullOrEmpty(Authorization))
            {
                request.Headers.Add("Authorization", Authorization);
            }

            if (CookieContainer != null)
            {
                request.CookieContainer = CookieContainer;
            }
            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                request.ContentType = "";
                return GetResponseBody(response);
            }
            catch (WebException ex)
            {
                WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
                throw ex;
            }
        }

        /// <summary>
        /// 异步下载
        /// </summary>
        /// <returns>Tuple Item1.实际读取到的数据, Item2.数据的实际大小</returns>
        public Task<byte[]> DownloadAsync()
        {
            return Task.Run(() => Download());
        }

        /// <summary>
        /// 同步下载
        /// </summary>
        /// <returns></returns>
        public byte[] Download()
        {
            var stream = DownloadToStream();
            using (var ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                stream.Dispose();
                return ms.GetBuffer();
            }
        }

        /// <summary>
        /// 同步下载到流
        /// </summary>
        /// <returns></returns>
        public Stream DownloadToStream()
        {
            WebExceptionResponse = "";
            var request = (HttpWebRequest)WebRequest.Create(Url);
            request.AllowAutoRedirect = AllowAutoRedirect;
            request.Method = "GET";
            request.Accept = Accept;
            request.Referer = Referer;
            request.UserAgent = UserAgent;
            request.ContentType = ContentType;
            request.KeepAlive = KeepAlive;
            request.Proxy = Proxy;
            request.Timeout = Timeout;
            request.ReadWriteTimeout = Timeout;
            // request.ContinueTimeout = Timeout;
            ResponseHeaders = null;

            ExtraHeadList.ForEach(p => request.Headers.Add(p));
            foreach (var item in FixedHeadList)
            {
                request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
            }

            if (!string.IsNullOrEmpty(VirtualIp))
            {
                request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
                request.Headers.Add("VIA", VirtualIp);
                request.Headers.Add("REMOTE_ADDR", VirtualIp);
                request.Headers.Add("CLIENT_IP", VirtualIp);
            }

            if (!string.IsNullOrEmpty(Authorization))
            {
                request.Headers.Add("Authorization", Authorization);
            }

            if (CookieContainer != null)
            {
                request.CookieContainer = CookieContainer;
            }

            try
            {
                return GetResponseStream((HttpWebResponse)request.GetResponse());
            }
            catch (WebException ex)
            {
                WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
                throw ex;
            }
        }

        Stream GetResponseStream(HttpWebResponse response)
        {
            var contentEncoding = string.IsNullOrEmpty(response.ContentEncoding) ? "" : response.ContentEncoding.ToLower();
            Stream stream = null;
            if (contentEncoding == "")
            {
                stream = response.GetResponseStream();
            }
            else if (contentEncoding.Contains("gzip"))
            {
                stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
            }
            else if (contentEncoding.Contains("deflate"))
            {
                stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress);
            }
            else
            {
                stream = response.GetResponseStream();
            }
            return stream;
        }

        /// <summary>
        /// 异步post
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        public Task<string> PostAsync(string content)
        {
            return Task.Run(() => Post(content));
        }

        /// <summary>
        /// 同步post
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        public string Post(string content)
        {
            ServicePointManager.Expect100Continue = false;
            WebExceptionResponse = "";
            var request = (HttpWebRequest)WebRequest.Create(Url);
            request.AllowAutoRedirect = AllowAutoRedirect;
            request.Method = "POST";
            request.Accept = Accept;
            request.Referer = Referer;
            request.UserAgent = UserAgent;
            request.KeepAlive = KeepAlive;
            request.Proxy = Proxy;
            request.Timeout = Timeout;
            request.ReadWriteTimeout = Timeout;
         
            if (ContentType == null)
            {
                ContentType = "application/x-www-form-urlencoded";
            }

            request.ContentType = ContentType;
            ResponseHeaders = null;

            ExtraHeadList.ForEach(p => request.Headers.Add(p));
            foreach (var item in FixedHeadList)
            {
                request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
            }

            if (!string.IsNullOrEmpty(VirtualIp))
            {
                request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
                request.Headers.Add("VIA", VirtualIp);
                request.Headers.Add("REMOTE_ADDR", VirtualIp);
                request.Headers.Add("CLIENT_IP", VirtualIp);
            }

            if (!string.IsNullOrEmpty(Authorization))
            {
                request.Headers.Add("Authorization", Authorization);
            }

            if (CookieContainer != null)
            {
                request.CookieContainer = CookieContainer;
            }

            var buffer = Encoding.GetBytes(content);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);

            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                request.ContentType = "";
                return GetResponseBody(response);
            }
            catch (WebException ex)
            {
                WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
                throw;
            }
        }

        /// <summary>
        /// 同步post
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        public string PostLogin(string content)
        {
            ServicePointManager.Expect100Continue = false;
            WebExceptionResponse = "";
            var request = (HttpWebRequest)WebRequest.Create(Url);
            request.AllowAutoRedirect = false;
            request.Method = "POST";
            request.Accept = Accept;
            request.Referer = Referer;
            request.UserAgent = UserAgent;
            request.KeepAlive = KeepAlive;
            request.Proxy = Proxy;
            request.Timeout = 15 * 1000;
            request.ReadWriteTimeout = Timeout;
            if (ContentType == null)
            {
                ContentType = "application/x-www-form-urlencoded";
            }

            request.ContentType = ContentType;
            ResponseHeaders = null;

            ExtraHeadList.ForEach(p => request.Headers.Add(p));
            foreach (var item in FixedHeadList)
            {
                request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
            }

            if (!string.IsNullOrEmpty(VirtualIp))
            {
                request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
                request.Headers.Add("VIA", VirtualIp);
                request.Headers.Add("REMOTE_ADDR", VirtualIp);
                request.Headers.Add("CLIENT_IP", VirtualIp);
            }

            if (!string.IsNullOrEmpty(Authorization))
            {
                request.Headers.Add("Authorization", Authorization);
            }

            if (CookieContainer != null)
            {
                request.CookieContainer = CookieContainer;
            }
            var buffer = Encoding.GetBytes(content);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);

            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                string LocationUrl = response.Headers["Location"];
                return GetResponseBody(response);
            }
            catch (WebException ex)
            {
                WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
                throw ex;
            }
        }

        public void GetAllCookies(CookieContainer cc)
        {
            Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
            StringBuilder sb = new StringBuilder();
            foreach (object pathList in table.Values)
            {
                SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
                foreach (CookieCollection colCookies in lstCookieCol.Values)
                    foreach (Cookie c in colCookies)
                    {
                        Console.WriteLine(c.Domain + ":" + c.Name + "____" + c.Value + "\r\n");
                    }
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个C#中的HTTP请求帮助的例子: ```csharp using System; using System.IO; using System.Net; namespace HttpHelper { public class HttpWebRequestHelper { public static string HttpGet(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "text/html;charset=UTF-8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, System.Text.Encoding.GetEncoding("utf-8")); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; } public static string HttpPost(string url, string postData) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; byte[] data = System.Text.Encoding.UTF8.GetBytes(postData); request.ContentLength = data.Length; Stream stream = request.GetRequestStream(); stream.Write(data, 0, data.Length); stream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, System.Text.Encoding.GetEncoding("utf-8")); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; } } } ``` 使用方法: ```csharp string url = "http://www.example.com"; string result = HttpWebRequestHelper.HttpGet(url); Console.WriteLine(result); ``` ```csharp string url = "http://www.example.com"; string postData = "param1=value1&param2=value2"; string result = HttpWebRequestHelper.HttpPost(url, postData); Console.WriteLine(result); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值