文章正文

一个获取访问URL页面的信息的HTTP类库

加入时间:2016/8/22 14:50:19

对WebRequest进行了封装,类库自动记录连续访问页面的cookies信息,使用该类库模拟登录网站比较方便

    public class Http
    {
        /// <summary>
        /// 使用Cookies
        /// </summary>
        public bool UseCookies { get; set; }
        /// <summary>
        /// 保存Cookies
        /// </summary>
        public bool SaveCookies { get; set; }
        /// <summary>
        /// 解码GZip
        /// </summary>
        public bool DecompressGZip { get; set; }

        /// <summary>
        /// Cookie容器
        /// </summary>
        public CookieContainer CookieContainer { get; set; }

        private Encoding _coding;
        /// <summary>
        /// 编码
        /// </summary>
        public Encoding Coding {
            get { return _coding ?? Encoding.UTF8; }
            set { _coding = value; }
        }
        public Http()
        {
            UseCookies = true;
            SaveCookies = true;
            DecompressGZip = true;
            CookieContainer = new CookieContainer();
        }


        private HttpWebRequest CreateRequest(string url, string method, string data = null, Encoding encoding = null, Dictionary<string, string> headers = null, string contentType = "application/x-www-form-urlencoded", string referer="")
        {
            try
            {
                var request = (HttpWebRequest) WebRequest.Create(url);
                if (UseCookies)
                    request.CookieContainer = CookieContainer;
                else
                    request.CookieContainer = new CookieContainer();
                request.Method = method;
                if (!string.IsNullOrEmpty(referer))
                    request.Referer = referer;
                if (headers != null && headers.Count > 0)
                {
                    foreach (var header in headers)
                        request.Headers.Add(header.Key, header.Value);
                }
                request.UserAgent =
                    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1";
                if (method.Equals("post", StringComparison.CurrentCultureIgnoreCase))
                {
                    request.ContentType = contentType;

                    if (!string.IsNullOrEmpty(data))
                    {
                        if (encoding == null)
                            encoding = Coding;

                        var bytes = encoding.GetBytes(data);
                        request.ContentLength = bytes.Length;
                        var requestStream = request.GetRequestStream();
                        requestStream.Write(bytes, 0, bytes.Length);
                    }
                }
                return request;
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        private Stream GetResponseStream(HttpWebRequest request)
        {
            var response = (HttpWebResponse)request.GetResponse();
            if (SaveCookies && response.Cookies != null && response.Cookies.Count > 0)
            {
                for (var i = 0; i < response.Cookies.Count; i++)
                    CookieContainer.Add(response.Cookies[i]);
            }

            var responseStream = response.GetResponseStream();
            if (DecompressGZip && response.ContentEncoding.ToLower().Contains("gzip"))
            {
                if (responseStream != null)
                {
                    var stream = new GZipStream(responseStream, CompressionMode.Decompress);
                    return stream;
                }
            }
            return responseStream;
        }


        public string Get(string url, Encoding coding = null, Dictionary<string, string> headers = null, string referer = "")
        {
            try
            {
                var request = CreateRequest(url, "Get", headers: headers, referer: referer);
                var stream = GetResponseStream(request);
                if (coding == null)
                    coding = Coding;
                using (var reader = new StreamReader(stream, coding))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                return "";
            }
        }

        public Image GetImage(string url, Encoding coding = null, Dictionary<string, string> headers = null,string refere="")
        {
            try { 
                var request = CreateRequest(url, "Get", headers: headers,referer:refere);
                var stream = GetResponseStream(request);
                return Image.FromStream(stream);
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        public string Post(string url, string data, Encoding coding = null, Dictionary<string, string> headers = null, string contentType = "application/x-www-form-urlencoded", string referer = "")
        {
            try{
                var request = CreateRequest(url, "post", data, coding, headers,contentType,referer);
                var stream = GetResponseStream(request);
                if (coding == null)
                    coding = Coding;
                using (var reader = new StreamReader(stream, coding))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                return "";
            }
        }
    }

字体大小[ ]

版权所有:有信心——uxinxin 我的个人网站欢迎常来!手机版(新站开启,请多多关照) 豫ICP备12017930号-1
 豫公网安备41910102000493号