• HttpOperater


    using System;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace Whir.Software.DocumentDownLoader.Library
    {
        /// <summary>
        ///     模拟HTTP操作
        /// </summary>
        public class HttpOperater
        {
            /// <summary>
            ///     发起Http请求
            /// </summary>
            /// <param name="httpRequestType">请求方式</param>
            /// <param name="url">请求地址</param>
            /// <param name="cookieInput">请求时传入的cookie</param>
            /// <param name="cookieOutput">服务器返回的cookie</param>
            /// <param name="postData">发送数据</param>
            /// <returns></returns>
            public static string DoRequest(HttpRequestType httpRequestType, string url, string cookieInput, ref string cookieOutput, string postData)
            {
                string response;
                try
                {
                    const string windowsUserName = "";
                    const string windowsPwd = "";
                    const string userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36";
                    const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                    const string acceptLanguage = "zh-CN,zh;q=0.8";
                    const string acceptEncoding = "gzip,deflate,sdch";
                    CookieContainer cookieContainer = GetCookie(url, cookieInput);
    
                    var newUri = new Uri(url);
                    var request = (HttpWebRequest)WebRequest.Create(newUri);
                    request.PreAuthenticate = true;
                    if (windowsUserName.Length > 0 & windowsPwd.Length > 0)
                    {
                        request.Credentials = new NetworkCredential(windowsUserName.Trim(), windowsPwd.Trim());
                    }
                    request.Timeout = 20000;
                    request.CookieContainer = cookieContainer;
                    request.UserAgent = userAgent;
                    request.Accept = accept;
                    request.Headers["Accept-Language"] = acceptLanguage;
                    request.Headers["Accept-Charset"] = acceptEncoding;
                    request.Headers["Accept-Encoding"] = acceptEncoding;
                    request.Referer = newUri.AbsoluteUri;
                    request.Method = httpRequestType == HttpRequestType.GET ? "GET" : "POST";
                    if (request.Method == "POST")
                    {
                        request.ContentType = "application/x-www-form-urlencoded";
                        byte[] bytes = Encoding.UTF8.GetBytes(postData);
                        request.ContentLength = bytes.Length;
                        using (Stream requestStream = request.GetRequestStream())
                        {
                            requestStream.Write(bytes, 0, bytes.Length);
                        }
                    }
                    using (var wr = (HttpWebResponse)request.GetResponse())
                    {
                        response = new StreamReader(wr.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();
                    }
                    CookieCollection cookies = cookieContainer.GetCookies(newUri);
                    cookieOutput = CookieTostr(cookies);
                }
                catch (NotSupportedException exception)
                {
                    response = exception.Message;
                }
                catch (InvalidOperationException exception)
                {
                    response = exception.Message;
                }
                catch (IOException exception)
                {
                    response = exception.Message;
                }
                catch (Exception exception)
                {
                    response = exception.Message;
                }
                return response;
            }
            /// <summary>
            /// 设置cookie域
            /// </summary>
            /// <param name="url">请求地址</param>
            /// <param name="cookieInput">cookie</param>
            /// <returns></returns>
            private static CookieContainer GetCookie(string url, string cookieInput)
            {
                var cookieContainer = new CookieContainer();
                var cookies = new CookieCollection();
                string[] cookiesArr = cookieInput.Split(';');
                foreach (string s in cookiesArr)
                {
                    string[] keyValuePair = s.Split('=');
                    if (keyValuePair.Length > 1)
                    {
                        var cookie = new Cookie
                            {
                                Name = keyValuePair[0].Trim(),
                                Value = keyValuePair[1].Trim(),
                                Domain = GetDomain(url).Trim()//设置cookie域
                            };
                        cookies.Add(cookie);
                    }
                }
                cookieContainer.Add(cookies);
                return cookieContainer;
            }
            /// <summary>
            /// 通过Url取得域
            /// </summary>
            /// <param name="url"></param>
            /// <returns></returns>
            private static string GetDomain(string url)
            {
                var regex = new Regex("(?i)http[s]*://(?<domain>[\w|.]*)",
                                      RegexOptions.CultureInvariant | RegexOptions.Compiled);
                return regex.Match(url).Groups["domain"].Value;
            }
    
            /// <summary>
            /// 将cookie转为字符串
            /// </summary>
            /// <param name="cookies"></param>
            /// <returns></returns>
            private static string CookieTostr(CookieCollection cookies)
            {
                return cookies.Cast<Cookie>()
                              .Aggregate(string.Empty, (current, c) => current + (c.Name + "=" + c.Value + ";"));
            }
        }
    
        /// <summary>
        ///     HTTP请求方式
        /// </summary>
        public enum HttpRequestType
        {
            /// <summary>
            ///     GET
            /// </summary>
            GET = 1,
    
            /// <summary>
            ///     POST
            /// </summary>
            POST = 2
        }
    }
    

    注:使用时,ref string cookiesOutput参数是服务器返回的Cookie,需保存用于下次请求。



  • 相关阅读:
    第二篇:如何在IIS上启用HTTP压缩
    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its 错误解决办法
    linux字符集查看与设置
    MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
    SELinux状态修改
    zabbix server is not running解决办法
    mysql存储过程之事务篇
    mysql时间相减的问题
    MySql存储过程及MySql常用流程控制语法
    shell 字符串处理汇总(查找,替换等等)
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/3618414.html
Copyright © 2020-2023  润新知