C# 请求帮助类

RestSharp版(不同版本,调用上有差异,本处使用的版本是:108.0.3.0)

 /// <summary>
    /// HTTP请求帮助类
    /// </summary>
    public static class RequestHelper
    {
        /// <summary>
        /// 默认请求超时时间(毫秒)
        /// </summary>
        private const int TimeOut = 15 * 1000;

        #region post请求

        public static T HttpPost<T>(string url, object data, Dictionary<string, string> headerDic = null, int timeOut = TimeOut, string contentType = "application/json")
        {
            return SerializeHelper.Deserialize<T>(HttpPost(url, data, headerDic, timeOut, contentType));
        }

        public static string HttpPost(string url, object data, Dictionary<string, string> headerDic = null, int timeOut = TimeOut, string contentType = "application/json")
        {
            HttpsDefaultSet(url);

            //请求
            RestRequest request = new RestRequest(url, Method.Post);
            AddHeaderInfo(request, headerDic);
            request.Timeout = timeOut;
            request.AddHeader("Content-Type", contentType);
            if (data != null)
            {
                if (contentType == "application/x-www-form-urlencoded")
                {
                    request.AddStringBody(Convert.ToString(data), DataFormat.Binary);
                }
                else
                {
                    request.AddStringBody(SerializeHelper.ToJson(data), DataFormat.Json);
                }
            }

            //响应
            RestResponse response;
            using (var client = new RestClient())
            {
                response = client.Execute(request);
            }
            if (response.StatusCode == HttpStatusCode.OK)
            {
                return response.Content;
            }
            throw new Exception($"HttpPost请求出错(状态码:{(int)response.StatusCode},内容:{response.Content})");
        }
        #endregion

        #region  get请求

        public static T HttpGet<T>(string url, Dictionary<string, string> urlParameters = null, Dictionary<string, string> headerDic = null, string referer = null, int timeOut = TimeOut)
        {
            return SerializeHelper.Deserialize<T>(HttpGet(url, urlParameters, headerDic, referer, timeOut));
        }

        public static string HttpGet(string url, Dictionary<string, string> urlParameters = null, Dictionary<string, string> headerDic = null, string referer = null, int timeOut = TimeOut)
        {
            HttpsDefaultSet(url);

            //请求
            RestRequest request = new RestRequest(BuildQuery(url, urlParameters));
            request.Timeout = timeOut;
            AddHeaderInfo(request, headerDic);
            if (string.IsNullOrEmpty(referer) == false)
            {
                request.AddHeader("referer", referer);
            }

            //响应
            RestResponse response;
            using (var client = new RestClient())
            {
                response = client.Execute(request);
            }
            if (response.StatusCode == HttpStatusCode.OK)
            {
                return response.Content;
            }
            throw new Exception($"HttpGet请求出错(状态码:{(int)response.StatusCode},内容:{response.Content})");
        }
        #endregion

        #region 其他辅助方法
        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        }

        /// <summary>
        /// https默认设置
        /// </summary>
        private static void HttpsDefaultSet(string reqUrl)
        {
            //主要是解决https基础连接已关闭……的报错问题
            if (reqUrl.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                //ServicePointManager.DefaultConnectionLimit = 200; 
                //System.GC.Collect();
                //System.Threading.Thread.Sleep(5);
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RequestHelper.CheckValidationResult);
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            }
        }

        /// <summary>
        /// 添加请求头信息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="headerDic"></param>
        public static void AddHeaderInfo(RestRequest request, Dictionary<string, string> headerDic)
        {
            if (headerDic != null)
            {
                foreach (var item in headerDic)
                {
                    request.AddHeader(item.Key, item.Value);
                }
            }
        }

        /// <summary>
        /// 组装Get请求参数。
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="parameters">Key-Value形式请求参数字典</param>
        /// <returns>URL编码后的请求数据</returns>
        public static string BuildQuery(string url, IDictionary<string, string> parameters)
        {
            string query = BuildQuery(parameters);
            if (url.IndexOf("?") > -1)
            {
                query = "&" + query;
            }
            else
            {
                query = "?" + query;
            }
            return url + query;
        }

        /// <summary>
        /// 组装Get请求参数。
        /// </summary>
        /// <param name="parameters">Key-Value形式请求参数字典</param>
        /// <returns>URL编码后的请求数据</returns>
        public static string BuildQuery(IDictionary<string, string> parameters)
        {
            StringBuilder postData = new StringBuilder();
            if (parameters != null)
            {
                bool hasParam = false;
                IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
                while (dem.MoveNext())
                {
                    string name = dem.Current.Key;
                    string value = dem.Current.Value;
                    // 忽略参数名或参数值为空的参数
                    if (!string.IsNullOrEmpty(name))//&& !string.IsNullOrEmpty(value)
                    {
                        if (hasParam)
                        {
                            postData.Append("&");
                        }
                        postData.Append(name);
                        postData.Append("=");
                        postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));
                        hasParam = true;
                    }
                }
            }
            return postData.ToString();
        }
        #region 获取客户端IP地址
        /// <summary>
        /// 获取客户端IP地址
        /// </summary>
        /// <returns></returns>
        public static string GetIP()
        {
            string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (string.IsNullOrEmpty(result))
            {
                result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }
            if (string.IsNullOrEmpty(result))
            {
                result = HttpContext.Current.Request.UserHostAddress;
            }
            if (string.IsNullOrEmpty(result))
            {
                return "0.0.0.0";
            }
            return result;
        }
        #endregion

        #endregion
    }

  

HttpWebRequest版 

public class RequestHelper
    {
        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        }

        #region  post 请求
        public static string HttpPost(string url, object data, Dictionary<string, string> headerDic = null, int timeOut = 1000 * 10, string contentType = "application/json")
        {
            try
            {
                string paramData = string.Empty;
                HttpsDefaultSet(url);
                HttpWebRequest wbRequest = (HttpWebRequest)WebRequest.Create(url);
                wbRequest.Method = "POST";
                wbRequest.Timeout = timeOut;
                wbRequest.KeepAlive = false;
                AddHeaderInfo(wbRequest, headerDic);
                wbRequest.ContentType = contentType;
                if (data != null)
                {
                    if (data.GetType() == typeof(String) || wbRequest.ContentType == "application/x-www-form-urlencoded")
                    {
                        paramData = Convert.ToString(data);
                    }
                    else
                    {
                        paramData = SerializeHelper.ToJson(data);
                        wbRequest.ContentLength = Encoding.UTF8.GetByteCount(paramData);
                    }
                }

                using (Stream requestStream = wbRequest.GetRequestStream())
                {
                    using (StreamWriter swrite = new StreamWriter(requestStream))
                    {
                        swrite.Write(paramData);
                    }
                }

                using (HttpWebResponse wbResponse = (HttpWebResponse)wbRequest.GetResponse())
                {
                    using (Stream responseStream = wbResponse.GetResponseStream())
                    {
                        using (StreamReader sread = new StreamReader(responseStream))
                        {

                            return sread.ReadToEnd();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Dictionary<string, string> exMsg = new Dictionary<string, string>();
                exMsg.Add("codeLocation", "RequestHelper-HttpPost");
                exMsg.Add("url", url);
                if (data != null)
                {
                    exMsg.Add("data", SerializeHelper.ToJson(data));
                }
                if (headerDic != null && headerDic.Count > 0)
                {
                    exMsg.Add("headerDic", SerializeHelper.ToJson(headerDic));
                }
                exMsg.Add("timeOut", timeOut.ToString());
               WebLogHelper.Error(exMsg);
                throw ex;
            }
        }

        public static T HttpPost<T>(string url, object data, Dictionary<string, string> headerDic = null, int timeOut = 1000 * 10, string contentType = "application/json")
        {
            return SerializeHelper.Deserialize<T>(HttpPost(url, data, headerDic, timeOut, contentType));
        }
        #endregion

        #region  get请求
        public static T HttpGet<T>(string url, Dictionary<string, string> urlParameters = null, Dictionary<string, string> headerDic = null, string referer = null, int timeOut = 1000 * 10)
        {
            return SerializeHelper.Deserialize<T>(HttpGet(url, urlParameters, headerDic, referer, timeOut));
        }
        public static string HttpGet(string url, Dictionary<string, string> urlParameters = null, Dictionary<string, string> headerDic = null, string referer = null, int timeOut = 1000 * 10)
        {
            try
            {
                HttpsDefaultSet(url);
                //创建请求
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(BuildQuery(url, urlParameters));
                //GET请求
                request.Method = "GET";
                request.ContentType = "text/html;charset=UTF-8";
                request.Referer = referer;
                request.Timeout = timeOut;
                request.KeepAlive = false;
                AddHeaderInfo(request, headerDic);
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (Stream myResponseStream = response.GetResponseStream())
                    {
                        using (StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")))
                        {
                            //返回内容 
                            return myStreamReader.ReadToEnd();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Dictionary<string, string> exMsg = new Dictionary<string, string>();
                exMsg.Add("codeLocation", "RequestHelper-HttpGet");
                exMsg.Add("url", url);
                if (urlParameters != null && urlParameters.Count > 0)
                {
                    exMsg.Add("urlParameters", SerializeHelper.ToJson(urlParameters));
                }
                if (headerDic != null && headerDic.Count > 0)
                {
                    exMsg.Add("headerDic", SerializeHelper.ToJson(headerDic));
                }
                exMsg.Add("referer", referer);
                exMsg.Add("timeOut", timeOut.ToString());
                WebLogHelper.Error(exMsg);
                throw ex;
            }
        }
        #endregion 

        /// <summary>
        /// https默认设置
        /// </summary>
        private static void HttpsDefaultSet(string reqUrl)
        {
            //主要是解决https基础连接已关闭……的问题
            if (reqUrl.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                //ServicePointManager.DefaultConnectionLimit = 200; 
                //System.GC.Collect();
                //System.Threading.Thread.Sleep(5);
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RequestHelper.CheckValidationResult);
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            }
        }
        /// <summary>
        /// 添加请求头信息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="headerDic"></param>
        public static void AddHeaderInfo(HttpWebRequest request, Dictionary<string, string> headerDic)
        {
            if (headerDic != null)
            {
                foreach (var item in headerDic)
                {
                    request.Headers.Add(item.Key, item.Value);
                }
            }
        }

        /// <summary>
        /// 组装Get请求参数。
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="parameters">Key-Value形式请求参数字典</param>
        /// <returns>URL编码后的请求数据</returns>
        public static string BuildQuery(string url, IDictionary<string, string> parameters)
        {
            string query = BuildQuery(parameters);
            if (url.IndexOf("?") > -1)
            {
                query = "&" + query;
            }
            else
            {
                query = "?" + query;
            }
            return url + query;
        }

        /// <summary>
        /// 组装Get请求参数。
        /// </summary>
        /// <param name="parameters">Key-Value形式请求参数字典</param>
        /// <returns>URL编码后的请求数据</returns>
        public static string BuildQuery(IDictionary<string, string> parameters)
        {
            StringBuilder postData = new StringBuilder();
            if (parameters != null)
            {
                bool hasParam = false;
                IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
                while (dem.MoveNext())
                {
                    string name = dem.Current.Key;
                    string value = dem.Current.Value;
                    // 忽略参数名或参数值为空的参数
                    if (!string.IsNullOrEmpty(name))//&& !string.IsNullOrEmpty(value)
                    {
                        if (hasParam)
                        {
                            postData.Append("&");
                        }
                        postData.Append(name);
                        postData.Append("=");
                        postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));
                        hasParam = true;
                    }
                }
            }
            return postData.ToString();
        }
        #region 获取客户端IP地址
        /// <summary>
        /// 获取客户端IP地址
        /// </summary>
        /// <returns></returns>
        public static string GetIP()
        {
            if (HttpContext.Current == null)
            {
                return null;
            }
            string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (string.IsNullOrEmpty(result))
            {
                result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }
            if (string.IsNullOrEmpty(result))
            {
                result = HttpContext.Current.Request.UserHostAddress;
            }
            if (string.IsNullOrEmpty(result))
            {
                return "0.0.0.0";
            }
            return result;
        }
        #endregion
    }

  

posted @ 2021-07-25 18:25  兴趣就是天赋  阅读(210)  评论(0编辑  收藏  举报