HttpPostHelper

 /// <summary>
    /// 请求信息帮助
    /// </summary>
    public class HttpPostHelper
    {
        private static HttpPostHelper m_Helper;
        /// <summary>
        /// 单例
        /// </summary>
        public static HttpPostHelper Helper
        {
            get { return m_Helper ?? (m_Helper = new HttpPostHelper()); }
        }

        #region Json
        /// <summary>
        /// 获取请求的数据
        /// </summary>
        /// <param name="strUrl">请求地址</param>
        /// <param name="jsonParameters">json参数</param>
        /// <param name="token">令牌</param>
        /// <returns>返回:请求成功响应信息,失败返回null</returns>
        public string GetResponseString(string strUrl, string jsonParameters, string token = "")
        {
            string url = VerifyUrl(strUrl);
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);

            HttpWebResponse webResponse = PostRequest(webRequest, jsonParameters, token);

            if (webResponse != null && webResponse.StatusCode == HttpStatusCode.OK)
            {
                using (Stream newStream = webResponse.GetResponseStream())
                {
                    if (newStream != null)
                    {
                        using (StreamReader reader = new StreamReader(newStream))
                        {
                            string result = reader.ReadToEnd();
                            return result;
                        }
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// post 请求指定地址返回响应数据
        /// </summary>
        /// <param name="webRequest">请求</param>
        /// <param name="requestBody">传入参数</param>
        /// <param name="token">token</param>
        /// <returns>返回:响应信息</returns>
        private HttpWebResponse PostRequest(HttpWebRequest webRequest, string requestBody, string token = "")
        {
            byte[] byteArray = Encoding.UTF8.GetBytes(requestBody);
            webRequest.ContentType = "application/json";
            webRequest.ContentLength = byteArray.Length;
            webRequest.Method = "POST";
            webRequest.ProtocolVersion = HttpVersion.Version10;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            if (!string.IsNullOrEmpty(token))
            {
                webRequest.Headers.Add("Authorization", "Bearer " + token);
            }

            // 将参数写入流
            using (Stream newStream = webRequest.GetRequestStream())
            {
                newStream.Write(byteArray, 0, byteArray.Length);
                newStream.Close();
            }

            // 接收返回信息
            return (HttpWebResponse)webRequest.GetResponse();
        }
        #endregion

        #region form-data
        /// <summary>
        /// 获取请求的数据
        /// </summary>
        /// <param name="strUrl">地址</param>
        /// <param name="formItems">文件</param>
        /// <param name="dic">键值对</param>
        /// <param name="token">令牌</param>
        /// <returns></returns>
        public string GetResponseString(string strUrl, List<FormItemModel> formItems, Dictionary<string, string> dics, string token = "")
        {
            string url = VerifyUrl(strUrl);
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);

            HttpWebResponse webResponse = PostForm(webRequest, formItems, dics, token);

            if (webResponse != null && webResponse.StatusCode == HttpStatusCode.OK)
            {
                using (Stream newStream = webResponse.GetResponseStream())
                {
                    if (newStream != null)
                    {
                        using (StreamReader reader = new StreamReader(newStream))
                        {
                            string result = reader.ReadToEnd();
                            return result;
                        }
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// 使用Post方法获取字符串结果
        /// </summary>
        /// <param name="request">请求</param>
        /// <param name="formItems">文件</param>
        /// <param name="dic">键值对</param>
        /// <param name="token">令牌</param>
        /// <returns></returns>
        private HttpWebResponse PostForm(HttpWebRequest request, List<FormItemModel> formItems, Dictionary<string, string> dics, string token = "")
        {
            #region 初始化请求对象
            request.Method = "POST";
            request.Timeout = 20000; // 默认20秒
            request.KeepAlive = true;

            string boundary = "----" + DateTime.Now.Ticks.ToString("x");//分隔符
            request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
            #endregion

            // 令牌
            if (!string.IsNullOrEmpty(token))
            {
                request.Headers.Add("Authorization", "Bearer " + token);
            }

            //请求流
            var postStream = new MemoryStream();
            #region 处理键值对
            string keyFormdataTemplate =
                "\r\n--" + boundary +
                "\r\nContent-Disposition: form-data; name=\"{0}\"" +
                "\r\n\r\n{1}";
            foreach (var dic in dics)
            {
                string formdata = string.Format(
                        keyFormdataTemplate,
                        dic.Key,
                        dic.Value);
                byte[] formdataBytes = null;
                if (postStream.Length == 0)
                    formdataBytes = Encoding.UTF8.GetBytes(formdata.Substring(2, formdata.Length - 2));
                else
                    formdataBytes = Encoding.UTF8.GetBytes(formdata);
                postStream.Write(formdataBytes, 0, formdataBytes.Length);
            }
            #endregion

            #region 处理Form表单请求内容
            string fileFormdataTemplate =
                "\r\n--" + boundary +
                "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" +
                "\r\nContent-Type: application/octet-stream" +
                "\r\n\r\n";
            foreach (var item in formItems)
            {
                string formdata = string.Format(
                        fileFormdataTemplate,
                        item.Key,
                        item.FileName);
                byte[] formdataBytes = Encoding.UTF8.GetBytes(formdata);
                postStream.Write(formdataBytes, 0, formdataBytes.Length);

                //写入文件内容
                if (item.FileContent == null || item.FileContent.Length == 0)
                {
                    throw new Exception("上传文件时 FileContent 属性值不能为空");
                }
                else
                {
                    using (var stream = item.FileContent)
                    {
                        byte[] buffer = new byte[1024];
                        int bytesRead = 0;
                        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            postStream.Write(buffer, 0, bytesRead);
                        }
                    }
                }
            }
            //结尾
            var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
            postStream.Write(footer, 0, footer.Length);
            #endregion

            request.ContentLength = postStream.Length;

            #region 输入二进制流
            if (postStream != null)
            {
                postStream.Position = 0;
                //直接写入流
                using (Stream requestStream = request.GetRequestStream())
                {
                    byte[] buffer = new byte[1024];
                    int bytesRead = 0;
                    while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        requestStream.Write(buffer, 0, bytesRead);
                    }
                    postStream.Close();//关闭文件访问
                }
            }
            #endregion

            return (HttpWebResponse)request.GetResponse();
        }
        #endregion

        /// <summary>
        /// 验证URL
        /// </summary>
        /// <param name="url">待验证 URL</param>
        /// <returns></returns>
        private string VerifyUrl(string url)
        {
            if (string.IsNullOrEmpty(url))
                throw new Exception("URL 地址不可以为空!");

            if (url.StartsWith("http://", StringComparison.CurrentCultureIgnoreCase) || url.StartsWith("https://", StringComparison.CurrentCultureIgnoreCase))
                return url;

            return string.Format("http://{0}", url);
        }
    }

    /// <summary>
    /// 表单数据项
    /// </summary>
    public class FormItemModel
    {
        /// <summary>
        /// 表单键
        /// </summary>
        public string Key { set; get; }
        /// <summary>
        /// 上传的文件名
        /// </summary>
        public string FileName { set; get; }
        /// <summary>
        /// 上传的文件内容
        /// </summary>
        public Stream FileContent { set; get; }
    }

 

posted @ 2021-07-13 13:38  江境纣州  阅读(167)  评论(0)    收藏  举报